【问题标题】:Is it possible to update a makefile variable from within a target section?是否可以从目标部分更新生成文件变量?
【发布时间】:2020-11-08 23:00:28
【问题描述】:

我有一个简单的 Makefile,是这样的

CXX = g++
CXXFLAGS = -std=c++17 ...
...
all : $(TARGETS)

% : src/%.cpp $(SRCFILES)
    $(CXX) $(CXXFLAGS) $(MACROS) $(INCLUDES) $^ $(LDLIBS) -o $@

我想添加一个profile 目标,调用该目标时会将-pg 选项添加到CXXFLAGS 变量,然后调用所有目标。

我试过了

profile:
    CXXFLAGS += -pg
    all

但这不起作用并给出错误:

$ 制作个人资料
CXXFLAGS += -pg
make: CXXFLAGS: 找不到命令

【问题讨论】:

  • 在像 profile: 这样的目标之后,带有前导 TAB 和 CXXFLAGS 的下一行将被读取为配方的一部分。尝试单独一行:some-target: CXXFLAGS += -pg

标签: c++ linux makefile gnu-make


【解决方案1】:

正如您发现的那样,语法不起作用。配方不是 makefile 命令,它们是 shell 脚本并在 shell 中运行。

您应该为此使用target-specific variables

profile: CXXFLAGS += -pg
profile: all

我应该指出,虽然这看起来很有用,但它并不总是那么方便。如果您想使用不同的标志构建相同的目标(例如,.o 文件),您必须小心在构建之间始终手动运行clean,否则您将获得以不同方式构建的对象的混杂。

一般来说,经过一段时间后,人们会决定他们真正想做的是将不同类型的目标构建到不同的目录中,这样他们就不会混淆。一旦你这样做了,你需要不同的规则,然后你不妨把额外的标志放在那里。但是,在某些情况下,特定于目标的变量仍然很方便。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多