我有一个简单的makefile来帮助我编译一些例子:
ex104: ex104.cpp
$(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104
clean:
rm -f *.o $(EXECUTABLE)
Run Code Online (Sandbox Code Playgroud)
现在,这很好.问题是:我需要为每个示例明确编写规则,因此复制以下行很多次:
ex104: ex104.cpp
$(CPP) ex104.cpp $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o ex104
Run Code Online (Sandbox Code Playgroud)
有没有办法将它泛化一点?所以,我最终会象下面这样将建立一个命令行ex252从ex252.cpp自动生成:
make ex252
Run Code Online (Sandbox Code Playgroud)
幸运的是,它是一个仅模板库,因此我总是只需要从一个cpp文件构建,而且我不需要跟踪目标文件.
Make有一堆默认规则,你想要的东西应该有用,如果不是你的变量,你使用默认的标志来给出.
如果您的make版本没有这样的默认值,那么应该添加一个(它对应于GNU make default rule,其中一些中间变量是内联的,而过时的一个已被删除):
.cpp:
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@
Run Code Online (Sandbox Code Playgroud)
CXX是C++编译器
CXXFLAGS是C++编译器的标志
CPPFLAGS是预处理器的标志(它们在gnu make中的C和C++之间很常见)
LDFLAGS是链接的标志
TARGET_ARCH允许指定目标体系结构
LDLIBS是要链接的库