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

标签 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 实用程序似乎不理解文件路径。

最佳答案

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

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

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

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

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

关于c++ - 如何使用 Makefile 变量作为文件包含在 g++ 命令中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43680899/

相关文章:

clojure - Clojure 中是否存在惰性变量?

swift - 如何在 Swift 中创建一个指针?

c++ - 在 C 和 C++ 中通过编译器环境变量或命令行标志指定库路径?

c++ - QPixmap/QImage 窗口的最大尺寸

c++ - VC++2013 中嵌套可变参数模板结构的别名

c++ - 运算符不应该是常量,但可以是

c - MakeFile - 当目标通过时避免某些文件

linux - 启动 makefile 时将标准错误重定向到文件并将标准输出保留到屏幕

c++ - 使用和不使用默认构造函数声明泛型类有什么区别?

c++ - 使用非虚拟析构函数扩展基类是否危险?