GNU make:生成源文件列表

问题描述:

自动生成源文件列表(.c,.cpp等,不是标题)是否正常?GNU make:生成源文件列表

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

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

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

谢谢。

+0

从什么生成它们? .o文件列表? – bmargulies 2011-04-17 19:24:03

使用GNU可以使用通配符。示例请参见this question

+0

是否显示如何生成依赖关系。需要尽量减少重新编译。 – pic11 2011-04-17 19:58:46

+0

然后你使用通常的make depend机制......那里有很多例子。 – 2011-04-17 20:03:02

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

许多人使用Make通配符或find或类似的东西来生成某个目录树中存在的所有源文件的列表,然后将它们提供给编译器并将这些对象链接在一起。这是一个脆弱的解决方案,会让你陷入困境。如果源文件之间出现冲突(例如,两个单独的定义void foo()),则链接器将发出抱怨,并且可能不太清楚如何解决该问题。您可能会发现自己拥有源文件的森林,其中许多对您的项目来说是不必要的,这会减慢构建并导致冲突。如果您想在其他可执行文件中使用这些源(但不是全部),则必须使用符号链接或其他kludgery。

更好的方法是在makefile中指定哪些对象对给定目标是必需的,然后让Make弄清楚使用哪个源。这是Make擅长的。没有可靠的方法来自动维护对象列表,你只需要手工完成,但这不是很多工作;如果你经常改变它们,这是一件很麻烦的事情,那么你做错了什么。

编辑:
如果该项目是为你描述一个图书馆,那么是的,这是一个可行的方法,以及相当不错的。并且Tromey的方法将很好地工作以防止不必要的重新编译。

+0

我编辑了我的问题。这是一个图书馆。只有属于该项目的文件是* unstable *,其他项目在开发项目时不会改变。 – pic11 2011-04-17 19:55:01

+0

在这一点上,我会争辩说,如果你发现自己需要有多个“组”,那么将它们分组在不同的文件夹中也是可取的,这样维护人员就可以掌握在哪里使用! – 2011-04-18 06:28:25

+0

@Matthieu M .:我同意,但我想补充一点,每个目录应该包含一套自给自足的源代码,可以在不依赖其他目录的情况下进行编译和测试(或者至多需要一些简单的存根为外部来源)。如果不能将这些源清理干净,我认为它是界面设计问题的一个症状。 – Beta 2011-04-18 14:01:56