Makefile——多个目标,自动依赖
Makefile - multiple targets, automatic dependecies
我正在用c++做一个大项目。它由几个目标可执行文件组成,但其中大多数使用公共类。我的工作目录类似于:
.
..
Classes/
File.h
File.cpp
Encryption.h
Encryption.cpp
Database.h
Database.cpp
Bin/ (I want my objects to be compiled there)
FirstProgram.cpp
SecondProgram.coo
ThirdProgram.cpp
Makefile
- 我的一些类使用外部库。例如,要编译Encryption.cpp,我需要在目标中添加-lssl。有什么办法让我的makefile知道它吗?现在我必须在所有我使用Encryption.o的地方添加-lssl
- 我有点厌倦了查看每个目标使用的对象并将它们写入makefile。有没有办法让编译器找到所有需要的。o并自动编译它们?
- 我想将编译后的文件存储在Bin/目录中,避免每次运行make时重新编译。
现在我的makefile看起来像:
CXX=g++
FLAGS=-g -Wall -std=c++11
CLASSES=./Classes
Bin/%.o: %.cpp
$(CXX) $(FLAGS) -c -o $@ $<
Bin/%.o: $(CLASSES)/%.cpp
$(CXX) $(FLAGS) -c -o $@ $<
FirstProgram: Bin/File.o Bin/Encryption.o Bin/Database.o
$(CXX) $(FLAGS) -o Bin/$@ $^ -lssl `mysql_config --cflags --libs`
SecondProgram: ... Bin/... Bin/...
$(CXX) $(FLAGS) -o Bin/$@ $^ ??? additional libs there
对于1)你可以这样使用:
CRYPT_TARGETS := FirstProgram ThirdProgram
$(CRYPT_TARGETS): LDLIBS += -lssl
$(CRYPT_TARGETS): Bin/Encryption.o
Bin/FirstProgram: Bin/File.o Bin/Database.o
$(CXX) $(FLAGS) -o $@ $^ $(LDLIBS) `mysql_config --cflags --libs`
Bin/ThirdProgram: Bin/Astronomy.o Bin/KitchenSink.o
$(CXX) $(FLAGS) -o $@ $^ $(LDLIBS) `mysql_config --cflags --libs`
(注意我是如何改变目标名称的;当规则打算构建文件时,目标应该是文件的确切名称。
我不认为那是个好主意。在编辑代码时,您应该知道从二进制文件中添加和删除了哪些组件,这样就不会有太多额外的工作。Make不可能知道一个不存在的对象是需要的,除非你强加给自己的不是语言的一部分的命名约定(如果你喜欢这个想法,让我们知道,我们会告诉你怎么做)。然后是main
冲突……如果对象列表越来越长,并且重叠很多,也许你应该建立库。
3)是一个好主意,看起来好像你的makefile已经可以做到了。
相关文章:
- 如何在 CMake 中对目标依赖项进行分组?
- CMake "安装" 目标及其 SO 依赖项
- 跨目标传播库依赖项
- 如何为在 x86 主机上为 arm 目标交叉编译的项目安装依赖项
- 执行CMAKE目标的输出作为另一个目标的依赖
- 使用 CMake 外部项目为跨平台库依赖项的目标名称
- 模型依赖关系目标,在运行时链接
- 在不同于依赖DLL的文件夹中输出已编译目标的正确方法是什么
- 同一生成文件中的 make 目标之间的递归依赖关系
- 如何为依赖项目标添加 cmake 定义
- 如何只构建一个依赖项目标
- 无法开始,因为cygwin1.dll缺少.目标不是依赖关系
- CMAKE:目标依赖项存在问题(add_dependency不起作用?
- 为什么在构建依赖库之前没有开始编译目标可执行文件?
- 如何在不放置任何物理依赖项的情况下指定生成文件目标生成顺序
- 使目标和依赖项名称格式化
- CMake:如何指定"install"所依赖的目标?
- CMake如何确定目标依赖项的回退生成配置
- 安装目标依赖项
- (make/g++)包含自动生成的依赖目标的完整路径?(或方法)