【问题标题】:GNU make: generate list of source filesGNU make:生成源文件列表
【发布时间】:2011-04-17 18:59:40
【问题描述】:

自动生成源文件列表(.c、.cpp等,不是头文件)正常吗?

你会怎么做?我正在考虑使用 find 和 sed。

编辑:该项目是一个库。所有源文件都在项目目录中。没有不相关的源文件。所有目标文件都是使用相同的编译器选项生成的。我正在考虑按照 Tromey 的方式生成所有源文件的列表,然后为每个源文件生成一个依赖文件。这是一种可行的方法吗?

更多编辑:这是一个相当大的 C++ 库。该项目正在开发中。尽量减少重新编译是非常必要的。

谢谢。

【问题讨论】:

  • 从什么生成它们? .o 文件列表?

标签: c++ makefile gnu-make


【解决方案1】:

使用 GNU make,您可以使用通配符。示例见this question

【讨论】:

  • 确实展示了如何生成依赖项。需要尽量减少重新编译。
  • 然后你使用通常的 makedepend 机制......那里有很多例子。
【解决方案2】:

正常吗?这很常见,但并不明智。

许多人使用 Make 通配符或find 或类似的东西来生成某个目录树中存在的所有源文件的列表,然后将它们提供给编译器并将对象链接在一起。这是一个脆弱的解决方案,会给你带来麻烦。如果源文件之间出现冲突(例如,void foo() 的两个单独定义),链接器将抱怨并且可能不明显如何解决问题。您可能会发现自己拥有大量源文件,其中许多对您的项目来说是不必要的,从而减慢了构建速度并导致冲突。如果你想在另一个可执行文件中使用其中一些源(但不是全部),你将不得不求助于符号链接或其他一些杂项。

更好的方法是在 makefile 中指定给定目标所需的对象,然后让 Make 确定要使用的源。这就是 Make 擅长的。没有可靠的方法来自动维护对象列表,您只需要手动完成即可,但工作量并不大;如果你经常更换它们以至于这是一件真正的苦差事,那么你做错了什么。

编辑:
如果该项目是您所描述的库,那么是的,这是一种可行的方法,而且非常好。而且 Tromey 的方法可以很好地防止不必要的重新编译。

【讨论】:

  • 我编辑了我的问题。这是一个图书馆。只有属于该项目的文件是不稳定的,在项目开发过程中其他一切都不会改变。
  • 我认为,在这一点上,如果您发现自己需要多个“组”源,那么将它们分组到单独的文件夹中也是可取的,这样维护人员就可以掌握使用的内容在哪里!
  • @Matthieu M.:我同意,但我要补充一点,每个目录都应该包含一组自给自足的源,可以在不依赖其他目录的情况下编译和测试(或最多,它应该需要一些简单的存根用于外部源)。如果源不能被如此干净地隔离,我认为这是界面设计问题的征兆。
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多