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 |
有没有一种方法通用化一点?这样我就可以使用下面这样的命令行,从
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,可以找到内置的规则和标志。
在您的例子中,整个makefile看起来像:
1 | all: ex104 |
只要默认目标需要
1 2 3 | CXXFLAGS += -Wall -Wextra -Wpedantic -std=c++14 all: ex104 ex104: common_utils.cpp |
PS:在制作CPP中指的是C预处理器,而不是C++。