如何使用 Makefile 变量作为文件包含在 g++ 命令中?

How to use Makefile variables as files to include in g++ command?

提问人:Thibault de Villèle 提问时间:4/28/2017 更新时间:4/28/2017 访问量:464

问:

这是我的问题:我有一个 makefile 文件,其中包含用于编译项目中所有内容的信息,以使我的生活更轻松,但最近它让我有些头疼。

它可以编译多个文件,例如:

objects/io.o: sources/io.cpp
    @g++ -c $< -o $@ -std=c++11
objects/map.o: sources/map.cpp
    @g++ -c $< -o $@ -std=c++11

在makefile的顶部,我声明了这样的变量:

IO="objects/io.o"
MAP="objects/map.o"
[... other object files ...]
ALL="$(IO) $(MAP) [...]"

当我想编译我的主文件时,我使用这个命令:

main.exe: tests/main.cpp
    @g++ $< $(ALL) -o $@ -std=c++11

当我手动编译这个问题时(在一行命令中输入所有内容,而不是制作),它可以毫无问题地编译。make main.exe

但是,当我对项目使用make命令时,会弹出以下错误:

clang: error: no such file or directory: 'objects/io.o objects/map.o [...]'
make: *** [main.exe] Error 1

我不能以这种方式使用变量吗?我非常困惑。我知道这些文件是编译的,只是该实用程序似乎不理解文件路径。make

C++ 变量 makefile

评论

1赞 melpomene 4/28/2017
删除所有引号。
0赞 Thibault de Villèle 4/28/2017
我很傻。感谢您的帮助!

答:

1赞 Howard 4/28/2017 #1

我认为问题在于您引用了变量。尝试取消引用它们,它们不会扩展单个参数:

ALL = $(obj1) $(obj2) ...

此外,对于那些使用相同编译过程的对象,我通常定义一个规则:

obj/%.o: %.cc
    $(GCC) -o $@ -c $< $(FLAGS)

显然,这需要定义额外的变量和GCCFLAGS

评论

0赞 Thibault de Villèle 4/28/2017
快速问题,您的整体命令 (the ) 是每次都重新编译每个 .o 文件还是只编译修改后的文件?obj/%.o: %.cc
0赞 Howard 4/28/2017
它仅在被要求时编译对象文件。它将遵循相同的语义,就像您手动指定了每个语义一样。我通常使用它的方式是要求所有对象文件作为库或主可执行文件的依赖项。即 .当然,这可以通过将所有对象放入变量中来缩短main.exe: main.cc obj/obj1.o obj/obj2.o ...