生成文件在变量中时不选取依赖项
Makefile not picking up dependencies when in variable
我有一个文件结构,比如
/
|- Makefile
|- libs
|- lib1
|- lib2
|- src
|- file.cpp
我有一个顶级的制作文件,它在每个子目录中都包含一个 Rules.mk 文件。src 文件规则依赖于 lib1 和 lib2,它们也是由 makefile 构建的。
现在我有一个目标,比如:
# predefined rule
COMP := gcc -o $@ $< $(FLAGS)
file.o: OBJS := libs/lib1/lib1.o libs/lib2/lib2.o
file.o: file.cpp $(OBJS)
$(COMP) $(OBJS)
当构建东西(默认目标是file.o)时,它会抱怨库不存在。当我向 file.o 任务添加回显并打印出$(OBJS)
它会打印出我分配给它的所有库,但 make 不会触发构建它们。
当我将依赖项中的变量 $(OBJS) 替换为文件名时,它会触发构建,然后显然找到所需的库。
我认为这可能与.二次扩展,但它不应该,因为我没有使用任何延迟变量。
提前感谢!
问候 克里斯
PS:无论如何,该项目都在Github上,以下文件包含我正在谈论的规则:https://github.com/janhancic/CHIC/blob/242c0ceee558c2eb4b21fe73e94a9ab5f3fe0b49/src/Rules.mk
你不能这样做。 GNU make 的文档非常清楚:特定于目标的变量仅在配方中可用。 它们在目标列表或先决条件列表中不可用。 在先决条件列表中,make 将展开$(OBJS)
全局变量的值OBJS
,或者空字符串(如果不存在);不是特定于目标的变量值。
但是,我不明白你为什么要写这个:
file.o: OBJS := libs/lib1/lib1.o libs/lib2/lib2.o
当你可以写这个的时候:
file.o: libs/lib1/lib1.o libs/lib2/lib2.o
并且工作正常吗?
除了疯狂科学家已经说过的,
COMP := gcc -o $@ $< $(FLAGS)
使用立即赋值,它立即计算右侧的表达式,结果基本上是COMP := gcc -o $(FLAGS)
。请改用延迟分配:
COMP = gcc -o $@ $< $(FLAGS)
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 将依赖名称显式标记为类型名和模板的奇怪之处
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- C++GTKMM gui循环依赖关系
- 通过ccmake在cmake中缓存依赖选项
- 当基类是依赖类型时,这是一个缺陷吗
- 从不同的附加依赖项中识别等同命名的函数
- 如何在 CMake 中对目标依赖项进行分组?
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- VS 2015 链接错误 无法构建依赖于 libcurl 的项目
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 为什么内存屏障依赖于变量?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 反转依赖于 end() 的迭代器
- GCC,CMake,预编译标头和维护依赖项
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- 生成文件在变量中时不选取依赖项