关于c ++:创建一个简单的makefile泛型

Make a simple makefile generic

我有一个简单的makefile来帮助我编译一些示例:

1
2
3
4
5
   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104  

   clean:  
        rm -f *.o $(EXECUTABLE)

现在,这很好。问题是:我需要为每个示例显式地编写一个规则,从而多次复制以下行:

1
2
   ex104: ex104.cpp
        $(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104

有没有一种方法通用化一点?这样我就可以使用下面这样的命令行,从ex252.cpp自动生成ex252

1
make ex252

幸运的是,它是一个仅限模板的库,所以我总是只能从一个cpp文件构建,而不需要跟踪对象文件。


make有一系列默认规则,如果您使用默认规则来指定标志,而不是变量,那么您想要的规则应该是有效的。

如果您的make版本没有这样的默认值,那么应该添加一个(它对应于gnu make default规则,其中一些中间变量是内联的,而过时的则是删除的):

1
2
.cpp:
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@

CXX是C++编译器

CXXFLAGS是C++编译器的标志

CPPFLAGS是预处理器的标志(它们在GNU make中C和C++之间是通用的)

ldflags是链接的标志

目标架构允许指定目标架构

ldlibs是要链接的库


可能有点像:

1
2
%: %.cpp
    $(CXX) $< $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o $@

有关$<$@的更多详细信息,请查看自动变量。


如果我正确理解了你的问题,你在寻找类似模式规则的东西。如果正确,这个makefile应该编译目录中的每个cpp文件(从这里取):

1
2
%.o : %.cpp
        $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@


正如@aprogrammer所说,使用内置规则。我只是想扩大范围。

通过递归地对make的数据库转储进行grepping,可以找到内置的规则和标志。make -pq | grep %:获取可以生成可执行文件的规则列表,make -pq | grep '%: %.cpp' -A5查看它执行的实际命令。

在您的例子中,整个makefile看起来像:

1
all: ex104

只要默认目标需要ex104且存在ex104.cpp则选择%: %.cpp内置规则。你可以以此为基础。添加更多依赖项和标志。

1
2
3
CXXFLAGS += -Wall -Wextra -Wpedantic -std=c++14
all: ex104
ex104: common_utils.cpp

PS:在制作CPP中指的是C预处理器,而不是C++。