【问题标题】:specify directory for C++ object files and executable in Makefile在 Makefile 中指定 C++ 目标文件和可执行文件的目录
【发布时间】:2009-09-03 16:59:03
【问题描述】:

我正在使用 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。所以最好为目标文件指定目录。


测试版:

感谢您的帮助!请原谅我无法对您的回答发表评论。 在第二种情况下,您的方法的问题在于,在命令之后,一些包含多行的规则将在每一行收到前缀。例如

main.o : main.cc defs.h \

src/misc.h

变成:

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

$(BIN_DIR) src/misc.h

【问题讨论】:

  • 哦,对不起。自从我接触我的依赖处理程序以来已经有一段时间了,所以我忘记了。让我尝试修复它...

标签: makefile directory sed


【解决方案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 放在冒号之前的每个类似单词的东西前面”,但这可能没有必要,敲木头。

【讨论】:

    【解决方案2】:

    在 gnu.org make 手册中查找“vpath”。我认为这是您需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      相关资源
      最近更新 更多