使一个简单的makefile通用
Make a simple makefile generic
我有一个简单的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.cpp
构建ex252
:
make ex252
幸运的是,它是一个仅限模板的库,所以我总是需要从一个cpp文件构建,并且不需要跟踪对象文件。
Make有一组默认规则,如果您使用默认规则来代替变量,那么您想要的规则应该有效。
如果你的make版本没有这样的默认值,这应该添加一个(它对应于GNU make默认规则,内联了一些中间变量,删除了过时的变量):
.cpp:
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@
CXX是C++编译器
CXXFLAGS是C++编译器的标志
CPPFLAGS是预处理器的标志(它们在gnu-make中的C和C++之间很常见)
LDFLAGS是链接的标志
TARGET_ARCH允许指定目标体系结构
LDLIBS是链接的库
也许类似于:
%: %.cpp
$(CXX) $< $(INCS) $(LINKFLAGS) $(COMPILEFLAGS) -o $@
有关$<
和$@
的更多详细信息,请查看自动变量。
如果我正确理解你的问题,那么你正在寻找类似模式规则的东西。如果这是正确的,这个makefile应该编译目录中的每个cpp文件(取自这里):
%.o : %.cpp
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
正如@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:内置CPP指的是C预处理器,而不是C++。
- 在c++中用vector填充一个简单的动态数组
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的简单if-else语句是如何无法访问的代码
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 一种在C++中读取TXT配置文件的简单方法
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 显示错误输出的简单数组排序程序
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 为简单的src,include,libs文件夹项目编写Makefile
- C++ CMD 到简单的 Makefile 与 Clang 和 MingW
- C 简单的makefile建议
- 扩展一个简单的makefile以支持不同的隐式编译器标志
- "No such file or directory" 使用 makefile 时在 c++ 中执行简单 fstream 时出错
- 关于我的简单Makefile的问题
- 为什么这个简单的makefile不能在更改时重新构建源代码
- 简单的makefile.为什么.exe被创建,然后被make删除
- 我的简单g++ Makefile有什么问题?
- 如何修复这个简单的Makefile错误
- 使一个简单的makefile通用