Tud*_*dor 4 c gcc static-libraries
我是静态库新手,只是想 100% 确定我正在做的事情是正确的。简而言之,我将尝试用这个简单的例子来解释我的问题:
如果mylib.a我定义了以下函数:
int f1 (int a, int b) {/*some code here...*/}
int f2 (int a, int b) {/*some code here...*/}
int f3 (int a, int b) {/*some code here...*/}
// we also suppose that f1 does not call f2 or f3.
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我链接mylib.a但仅使用了f1. 也会f2进入f3最终的可执行文件吗?
我有一种感觉,这也是特定于编译器的,但我们考虑一下我们只在这里讨论GCC。我会找到有关其他编译器的任何具体信息,例如MSVC compiler它们如何处理这个问题,这些信息都很有价值,因为我想让我的库尽可能兼容。
我还发现维基百科上给出的解释含糊不清,因为我不清楚谁包括those parts of the library...。另外,该表达式it is enough to include并没有让我确信只包含所需的代码。
使用静态链接,包含目标可执行文件(或目标库)直接和间接引用的库部分就足够了。使用动态库时,会加载整个库,因为事先不知道应用程序将调用哪些函数。
传统上,当您链接静态库时,库中满足当前未满足引用的每个目标文件都将包含在可执行文件中。库中所选对象文件的任何引用也将被拾取,重复进行,直到没有更多的对象文件可以满足任何不满足的引用。然后链接过程继续到列表中的下一个库。
如果在到达最后一个库的末尾时仍然存在未解析的引用,则链接器会生成有关未定义的外部引用的错误消息。