【问题标题】:makefile auto removing .o filesmakefile 自动删除 .o 文件
【发布时间】:2011-11-06 00:22:51
【问题描述】:

我正在大学学习 C++ 课程,他们希望我们手动输入所有测试文件...但是我知道,有一种方法可以做到这一点,这就是我最终的结果current(http://pastebin.com/6d9UtKM4) 生成文件。我的问题是,为什么这个 makefile 会在完成后自动删除它用于编译的所有 .o 文件?它不会杀死我,但我想保留 .o 文件。我已经粘贴了makefile here(http://pastebin.com/6d9UtKM4)。我还粘贴了运行“make tests”here(http://pastebin.com/h3Ny3dib) 的当前结果。 (请注意该页面底部自动删除所有 .o 文件的部分。)

我也希望能够使它像这样生成:

  • g++ -o compileDir/assembler.o -c -Wall src/assembler.cpp
  • g++ -o compileDir/string.o -c -Wall src/string.cpp
  • g++ -c -Wall -o compileDir/test_assignment.o testSrc/test_assignment.cpp
  • g++ -o testDir/test_assignment compileDir/test_assignment.o compileDir/string.o compileDir/assembler.o
  • g++ -c -Wall -o compileDir/test_bracket.o testSrc/test_bracket.cpp
  • g++ -o testDir/test_bracket compileDir/test_bracket.o compileDir/string.o compileDir/assembler.o
  • testDir/test_bracket
  • testDir/test_assignment

换句话说,我希望它编译所有内容,然后运行所有内容。我希望这不是太多的要求!

编辑:附加信息:(这是“进行测试”的代码)

tests: assembler.o string.o $(test_output) $(test_stringOutput)
        @echo '--- Testing complete ---'

$(testDir)%: $(compileDir)%.o string.o
        g++ -o $@ $< $(compileDir)string.o $(compileDir)assembler.o
        $@
        @echo ''

$(compileDir)%.o: $(testSourceDir)%.cpp
        g++ -c -Wall -o $@ $<

$(compileDir)%.o: $(testStringSrc)%.cpp
        g++ -c -Wall -o $@ $<

编辑:-----------------------------------------

通过 cmets 解决:

添加此行修复它: .PRECIOUS $(compileDir)%.o

【问题讨论】:

  • 你不是每次都在运行make clean,是吗?
  • 不,我只是在运行 make 测试。那里的最终链接的输出 (pastebin.com/h3Ny3dib) 是键入 make tests 的结果

标签: c++ makefile


【解决方案1】:

你可以添加

.PRECIOUS: %.o

这应该是隐含的,但也许你有一个奇怪的设置。

【讨论】:

  • 我添加了这一行,但它仍然删除了所有 .o 文件。有没有我应该添加的特定位置?
  • 不,它可以去任何地方。如果这不起作用,那么是 something 故意删除它们,或者它们可能是在您不期望的地方生成的?
  • 是的,也许就像.PRECIOUS: obj/*.o 一样简单:)
  • 我没有在 makefile 中输入任何由 rm 组成的没有 -f 标志的东西。但是我发布了创建测试的行。 (测试完全通过变量进行。)我正在编译整个目录。
  • 我不知道为什么这很重要,或者您是否必须使用 % 而不是 *,但我使用了 .PRECIOUS: $(compiledir)%.o 并且它有效。谢谢!
【解决方案2】:

Make 将您的 .o 文件视为中间文件并删除它们。您可以通过添加特殊 .SECONDARY 目标的依赖项来防止自动删除它们。有关详细信息,请参阅Chains of Implicit Rules。祝你好运!

【讨论】:

  • 谢谢,我将另一个答案标记为正确,因为它解决了问题,但您的回答内容丰富。 (虽然我阅读了手册,但我不确定如何使用它,因为它不起作用。)
  • 我认为你是对的。这是因为 test_*.o 文件在任何不被视为 .PRECIOUS 的地方都没有用作依赖项。如果 makefile 使用隐式依赖以更传统的方式构建,则不会发生这种情况。
猜你喜欢
  • 1970-01-01
  • 2014-10-31
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-06
相关资源
最近更新 更多