假设库 A 有 a() 和 b()。如果我将我的程序 B 与 A 链接并调用 a(),b() 是否包含在二进制文件中?编译器是否查看程序中是否有任何函数调用 b()(也许 a() 调用 b() 或另一个库调用 b())?如果是这样,编译器如何获得这些信息?如果不是,如果我链接到一个大库但只使用一个次要功能,这不是对最终编译大小的巨大浪费吗?
最佳答案
看看link-time optimization .这必然取决于供应商。它还将取决于您如何构建二进制文件。 MS 编译器(至少从 2005 年起)提供了一种叫做 Function Level Linking 的东西。 -- 这是另一种剥离不需要的符号的方法。 This帖子解释了如何使用 GCC 实现相同的目的(这是旧的,GCC 必须继续前进,但内容与您的问题相关)。
另请查看 LLVM实现(和示例部分)。
我建议你也看看Linkers and Loaders约翰·莱文 (John Levine) 着——非常棒的读物。
关于c - 链接器如何决定要包含库的哪些部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/715502/