我有一个简单的makefile来帮助我编译一些例子:
ex104: ex104.cpp
$(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104
clean:
rm -f *.o $(EXECUTABLE)
现在,这很好用。问题是:我需要为每个示例明确写一条规则,因此多次复制以下行:
ex104: ex104.cpp
$(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104
有没有办法将它泛化一点?因此,我最终会得到一个如下所示的命令行,它会从ex252
自动构建ex252.cpp
:
make ex252
幸运的是,它只是一个模板库,因此我总是只需要从一个cpp文件构建,而且我不需要跟踪目标文件。
答案 0 :(得分:5)
Make有一堆默认规则,你想要的东西应该有效,如果不是你的变量,你使用的是默认规则。
如果您的make版本没有这样的默认值,那么应该添加一个(它对应于GNU make default rule,内联一些中间变量并删除一个中间变量):
.cpp:
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@
CXX是C ++编译器
CXXFLAGS是C ++编译器的标志
CPPFLAGS是预处理器的标志(它们在gnu make中的C和C ++之间很常见)
LDFLAGS是链接的标志
TARGET_ARCH允许指定目标架构
LDLIBS是要链接的库
答案 1 :(得分:3)
也许是这样的:
%: %.cpp
$(CXX) $< $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o $@
有关$<
和$@
的详细信息,请查看automatic variables。
答案 2 :(得分:2)
如果我正确理解您的问题,您正在寻找类似pattern rules的内容。如果这是正确的,这个makefile应该编译目录中的每个cpp文件(取自here):
%.o : %.cpp
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
答案 3 :(得分:1)
像@AProgrammer所说,使用内置规则。我只想扩展它。
您可以通过递归grepping make的数据库转储来查找内置规则和标志。 make -pq | grep %:
获取可生成可执行文件的规则列表,make -pq | grep '%: %.cpp' -A5
查看它执行的实际命令。
在你的情况下,字面意思是整个makefile看起来像:
all: ex104
只要默认目标需要ex104
并且ex104.cpp
存在,就会选择%: %.cpp
内置规则。你可以在此基础上继续。添加更多依赖项和标志。
CXXFLAGS += -Wall -Wextra -Wpedantic -std=c++14
all: ex104
ex104: common_utils.cpp
PS:在make中CPP指的是C预处理器,而不是C ++。