制作一个简单的makefile泛型

时间:2016-07-19 11:02:34

标签: c++ makefile

我有一个简单的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文件构建,而且我不需要跟踪目标文件。

4 个答案:

答案 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 ++。