我当前的目录如下:
root
|___src
| |
| |____Makefile
| |____a.cpp
| |____b.cpp
| |____c.h
| |____tests
| |
|______________|____test.cpp
makefile是否有办法强制test目录下的所有文件都包含c.h
答案 0 :(得分:1)
你还没有回答我的任何一个问题,所以我不得不做出一些猜测。
这可能是您正在寻找的内容:
%.o: %.cpp
@$(CXX) -c $< -o $@
tests/%.o: tests/%.cpp
@$(CXX) -include c.h -c $< -o $@
修改强>
如果要在源文件的顶部插入#include "c.h"
,可以使用此sed命令:
sed -i "" '1{h;s/.*/#include "c.h"/;G;}' filename
如果你想确定不要多次这样做,你可以这样做:
sed -i "" '1{h;s/.*/#include "c.h"/;G;s/\(.*\)\n\1$/\1/;}' filename
使用makefile有几种不同的方法。这是一种粗略但有效的方法:
tests/%.o: tests/%.cpp
@sed -i "" '1{h;s/.*/#include "c.h"/;G;s/\(.*\)\n\1$/\1/;}' $<
@$(CXX) -c $< -o $@
但是如果你只对每个源文件运行一次sed,那么Make会更好。这可以做到,但需要更仔细地考虑优先事项。
答案 1 :(得分:0)
gcc
和clang
支持-include file
命令行选项。
-include file
处理文件,好像#include“file”出现在主要源文件的第一行。但是,搜索文件的第一个目录是预处理器的工作目录,而不是包含主源文件的目录。如果在那里找不到,则在#include“...”搜索链的其余部分中搜索正常。
其他编译器可能有类似的选择。