链接器如何知道两个源文件中哪个是主文件,另一个包含函数定义?

Posted

技术标签:

【中文标题】链接器如何知道两个源文件中哪个是主文件,另一个包含函数定义?【英文标题】:How the linker know which among two source file is main and other contain function definitions? 【发布时间】:2018-01-27 17:59:32 【问题描述】:

以我有两个源文件func.cpp和main.cpp为例。 func.cpp 包含 10 个函数的定义。在 main.cpp 中包含 func.cpp 的相应头文件。现在编译器将分别编译目标文件 func.o 和 main.o 中的两个源文件。现在是链接器。链接器如何知道 main.cpp 是我的主文件并且具有从其他文件调用的一些函数并且需要解析它们?意味着为什么它不会在最终的可执行文件中转换 func.o,它没有需要解析的函数引用。另一方面,仅使用 func.o 中的一个函数的 main.o 通过解析该引用将转换为可执行文件。最终的可执行文件是否还会包含与 main.cpp 中未调用的其余 9 个函数相对应的目标代码?

【问题讨论】:

为什么你认为链接器需要知道main()在所有应用的输入文件中的哪一个被实现了?只需确保您有一个,并且链接器以正确的顺序看到它。 试试在两个文件中都放一个 main 会发生什么。 @manni66 至少最终可执行文件中会出现什么。所有 10 个函数,还是仅在 main 中调用的那个? 在 linux 上尝试 nm 或在 windows 上尝试 dumpbin。 【参考方案1】:

链接器如何知道 main.cpp 是我的主文件,并且有一些从其他文件调用的函数需要解析?

链接器并不真正关心哪个文件有main(),它只会查看所有目标文件中是否有一个(并且只有一个)main()

意味着为什么它不会将 func.o 转换为没有需要解析的函数引用的最终可执行文件。另一方面,仅使用 func.o 中的一个函数的 main.o 通过解析该引用将转换为可执行文件。

链接器不会将任何单个目标文件转换为可执行文件;它将所有目标文件链接到一个可执行文件中。

最终的可执行文件是否还会包含与 main.cpp 中未调用的其余 9 个函数相对应的目标代码?

这取决于。详细解释见this post。

【讨论】:

以上是关于链接器如何知道两个源文件中哪个是主文件,另一个包含函数定义?的主要内容,如果未能解决你的问题,请参考以下文章

无法删除文件提示已在另一个程序中打开

如何在此高级 makefile 中链接两个 .c 文件?

如何创建包含链接文件的 Visual Studio 项目模板?

使用 GNU ld 链接器脚本包含二进制文件

如何手动确定哪个链接器与给定的 libc 文件和给定的二进制文件一起使用?

如何修复编译 Mach-O 链接器错误