在Makefile中指定C ++目标文件和可执行文件的目录

时间:2009-09-03 16:59:03

标签: makefile directory sed

我正在使用gcc -MM生成依赖项规则的先决条件,以便将源文件编译为目标文件。我想在一些变量BIN_DIR = bin / release /的值中指定一个目录来保存目标文件和可执行文件。有两种情况:


案例1

%.d: *.h *.cc Makefile
     @$(CXX) -MM $(CXXFLAGS) *.cc > $@.$$$$; \
     sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; $(RM) -rf $@.$$$$

虽然对sed不熟悉,但我了解到sed实用程序的目的是翻译(例如):

  

main.o:main.cc defs.h

成:

  

main.o main.d:main.cc defs.h

我的问题是如何进一步改为:        bin / release / main.o bin / release / main.d:main.cc defs.h

如果有人能在这里解释sed的用法,那将非常感谢!


案例2

Makefile.depend: *.h *.cc Makefile
    $(CXX) -MM $(CXXFLAGS) *.cc > Makefile.depend

在Makefile.depend文件中,您将看到每个规则都是这样的例子:

  

main.o:main.cc defs.h

如何将其更改为:

  

bin / release / main.o:main.cc defs.h

谢谢和问候!


注:

我不知道为什么我现在不能发表评论。所以我把我的更新放在这里:

VPATH是指定源代码的目录。但是你必须从你希望目标文件的位置运行make -f path2Makefile。在这里,我希望能够从任何地方运行make -f path2 Makefile。所以最好指定目标文件的目录。


致Beta:

感谢您的帮助!请原谅我无法对你的答案发表评论。 你的方法在第二种情况下的问题是在命令之后,一些具有多行的规则将在每一行接收前缀。 e.g。

  

main.o:main.cc defs.h \

     

的src / misc.h

变为:

  

$(BIN_DIR)main.o:main.cc defs.h \

     

$(BIN_DIR)src / misc.h

2 个答案:

答案 0 :(得分:1)

对于案例1,您可以使用:

sed 's,\($*\)\.o[ :]*,$(BIN_DIR)\1.o $(BIN_DIR)$@ : ,g'

对于初学者来说,正则表达式是难以阅读的,但基本上这表示“将目标词干(请记住,事物1)后跟.o,吞噬后面的任何空格和冒号,并用BIN_DIR替换整个事物,记住的东西,.o,空间,BIN_DIR,规则的目标,空格和冒号“。

案例1会给您带来一些麻烦。首先,无论你是否真的需要,你都将重建main.o和main.d。有几种方法可以解决这个问题 - 最简单的方法是制作目标$(BIN_DIR)main.d和$(BIN_DIR)main.o,但是有更复杂的方法可以稍后再试。

对于案例2,这应该可以解决问题:

sed 's,^,$(BIN_DIR),'

这里正则表达式“将行的开头改为BIN_DIR”。

编辑:第二次尝试

sed 's,\(.*:\),$(BIN_DIR)\1,'

这说“找到以冒号结尾并在其前面贴上BIN_DIR的东西”。防弹的下一步将是“吮吸多行并将BIN_DIR放在冒号前面的每个单词之类的东西”,但这可能不是必需的,敲木头。

答案 1 :(得分:0)

在gnu.org制作手册中查找“vpath”。我认为这就是你所需要的。