GNU make:生成源文件列表

4

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

你会怎么做呢?我想使用find和sed。

编辑:这个项目是一个库。所有的源文件都在项目目录中。没有无关的源文件。所有的目标文件都使用相同的编译器选项生成。我打算按照Tromey的方式生成所有源文件的列表和每个源文件的依赖关系文件。这是可行的方法吗?

更多编辑:这是一个相当大的C++库。该项目正在开发中。最小化重新编译是非常希望的。

谢谢。


从哪里生成它们?从.o文件列表中吗? - bmargulies
2个回答

3

使用GNU make可以使用通配符。请参见这个问题以获取示例。


展示如何生成依赖项。这是为了最小化重新编译所必需的。 - pic11
然后您可以使用通常的make depend机制...有很多示例可供参考。 - Nicholas Riley

3

正常吗?这很普遍,但不明智。

许多人使用Make通配符或find或类似工具来生成某个目录树中存在的所有源文件列表,然后将它们提供给编译器并链接对象。这是一种脆弱的解决方案,会让你陷入麻烦。如果源文件之间出现冲突(例如,void foo()的两个不同定义),链接器会抱怨,并且修复问题可能不明显。你可能会发现自己有一大堆源文件,其中许多对你的项目来说都是不必要的,这会减慢你的构建速度并引起冲突。如果你想在另一个可执行文件中使用其中一些源文件(而不是全部),你就必须使用符号链接或其他一些技巧。

更好的方法是在makefile中指定哪些对象对于给定目标是必需的,然后让Make找出要使用哪些源文件。这正是Make擅长的。没有可靠的自动维护对象列表的方法,你只能手动完成,但这并不需要太多的工作;如果你经常更改它们以至于这成为真正的麻烦,那么你做错了什么。

编辑:
如果项目是一个库,正如你所描述的那样,那么是的,这是一种可行的方法,而且还是一种相当不错的方法。Tromey的方法将非常好地防止不必要的重新编译。


我编辑了我的问题。这是一个库。只有属于项目的文件是不稳定的,其他一切在项目开发过程中都不会改变。 - pic11
我认为,如果你发现自己需要有几个“组”来源,那么将它们分组到不同的文件夹中也是可取的,这样维护者就可以理解在哪里使用了! - Matthieu M.
@Matthieu M.:我同意,但我想补充一点,每个目录应该包含一个自给自足的源代码集,可以在不依赖其他目录的情况下进行编译和测试(或者最多需要一些简单的外部源代码存根)。如果源代码无法被如此清晰地分离,我认为这是接口设计问题的症状。 - Beta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接