源文件的编译顺序是如何决定的?

Posted

技术标签:

【中文标题】源文件的编译顺序是如何决定的?【英文标题】:How is the order of compilation of source files decided? 【发布时间】:2009-04-01 14:46:46 【问题描述】:

我有一个包含许多 *.c 文件的工作区,我对其进行编译。 (我可以使用任何工具链,比如 MSVC6.0 或 gcc 等)

先编译哪个源文件?

随后要编译的文件的顺序是如何决定的?

【问题讨论】:

【参考方案1】:

C 标准未指定编译顺序。

由于不需要像 C++ 中那样构建全局对象,因此在 C 中不存在编译顺序相关的情况。

【讨论】:

【参考方案2】:

通常,这在任何地方都没有指定。特别是在使用例如。并行make,编译顺序几乎是任意的。

【讨论】:

【参考方案3】:

VC:按项目文件夹,然后按字母顺序。GCC:按make文件顺序

为什么这很重要?完成顺序不计且不影响最终构建结果。

【讨论】:

理解为什么之后需要链接目标代码很重要。 如果某些源文件包含#import 指令而其他包含应由该指令生成的头文件,这一点很重要。【参考方案4】:

make:

目标按照它们出现的顺序进行处理 为每个目标构建了一个依赖树,我猜想该树是通过后序评估深度优先遍历的(似乎是它工作的唯一方法,但我找不到任何指定这个的东西文档)

作为jpalecek suggests,并发构建可能更复杂。


一些来自 GNU make 文档的引述:

目标的双冒号规则按照它们在 makefile 中出现的顺序执行。

...

如果您指定多个目标,请按照您命名它们的顺序依次为每个目标创建流程。

【讨论】:

【参考方案5】:

如果这很重要,那么您确实需要在您的 makefile 中设置依赖项,以确保某些依赖项先于其他构建。真的,您应该首先问自己为什么这很重要。

【讨论】:

以上是关于源文件的编译顺序是如何决定的?的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个文件夹中编译多个文件? [复制]

Android JNI之编译

C++跨编译单元(一个源文件就是一个编译单元)(跨编译单元的初始化顺序是未定义的)

linux中编译得到的.o文件如何生成bin文件?

fortran 文件读写顺序

类的初始化