【发布时间】:2018-06-24 06:28:32
【问题描述】:
如果目标包含#include "foo/bar.hpp",我能否以自动编译和链接foo/bar.cpp 的方式配置我的makefile?
详细信息:我有一个结构如下的项目的生成文件:
src/
|-- program1/
| |-- main.cpp
| |-- makefile
|-- modules/
| |-- module1/
| | |-- foo.cpp
| | |-- foo.hpp
| |-- module1/
| | |-- bar.cpp
| | |-- bar.hpp
目前我的 program1 的 makefile 包含它使用的所有模块的所有 *.cpp 文件的列表,这很难维护并且容易出错并与我的包含保持同步。
但是,在我的代码中,遵循#include 命令将提供精确的依赖关系树。对于每个 *.hpp,我需要编译和链接一个对应的 *.cpp。
这个编译过程可以通过 makefile 自动化吗?自动依赖可以帮助我吗?
有问题的makefile:
# compiler settings
CXX = g++
CXXFLAGS = -std=c++14
# object file generation path
tmpDir = .objs
# modules path
modPath = ../modules
# Names of modules and files to be compiled
names := \
main.o \
module1/foo.o \
module2/bar.o
# prepend tmpDir
names := $(addprefix $(tmpDir)/, $(names))
# Linking
main: $(names)
$(CXX) $(CXXFLAGS) -o main $^
# Rule for main file
$(tmpDir)/main.o: main.cpp
@mkdir -p $(tmpDir)
$(CXX) $(CXXFLAGS) -c main.cpp -o $@ -I "$(modPath)"
# rules for module files
$(tmpDir)/%.o: $(modPath)/%.cpp
mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -rf *.o main $(tmpDir)
我想避免手动设置names。
【问题讨论】:
-
这里有哪些模块?只是源代码目录,还是每个模块都编译到特定的库?
-
啊,它们是纯源代码目录。没有单独的编译意图。此外,它们可能相互包含。
-
你会考虑使用像 CMake 这样的构建生成工具吗?它具有强大的抽象(函数、宏...),可以帮助您避免为这样的用例重复自己。
-
GCC可以以Makefile可以读取的格式输出所有标头依赖项。请参阅:标志-MMD -MP。如果您发布示例Makefile我可以尝试发布一个答案,说明它是如何工作的。 (假设你使用GCC) -
就我个人而言,每当源文件或头文件发生更改时,我会更关心自动重新编译所有更改的编译单元。完全忘记在 Makefile 中列出 .cpp 文件很快就会通过未解决的符号错误引起您的注意
标签: c++ c makefile automation