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

时间:2017-04-28 13:01:58

标签: c++ variables makefile

这是我的问题:我有一个包含信息的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实用程序似乎无法理解文件路径。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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