MakeFile:强制目录下的所有文件包含标题

时间:2016-10-07 21:08:43

标签: c++ makefile g++

我当前的目录如下:

root
  |___src
  |     |
  |     |____Makefile
  |     |____a.cpp
  |     |____b.cpp
  |     |____c.h
  |     |____tests
  |              |
  |______________|____test.cpp

makefile是否有办法强制test目录下的所有文件都包含c.h

2 个答案:

答案 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)

gccclang支持-include file命令行选项。

gcc documentation

  

-include file

     

处理文件,好像#include“file”出现在主要源文件的第一行。但是,搜索文件的第一个目录是预处理器的工作目录,而不是包含主源文件的目录。如果在那里找不到,则在#include“...”搜索链的其余部分中搜索正常。

其他编译器可能有类似的选择。