链接到静态库时多个函数调用

时间:2015-03-04 09:16:01

标签: c++ linker static-libraries

在我的c ++项目中,我对静态库中的函数进行了几次调用,所以我想知道链接器是否只复制了一次该函数,或者每次在源代码中调用它时都会这样。

2 个答案:

答案 0 :(得分:0)

链接器不会复制任何内容。当编译器找到函数调用时,它不知道定义,它将它作为外部符号。链接器将解析外部符号或抛出链接器错误。

因此,代码中对库方法的每次调用都将转换为jump to subroutine,这是代码部分中的地址。 在生成的二进制文件中,该子例程只存在一次。

希望这会对这个问题有所了解。

答案 1 :(得分:0)

链接器复制每个使用过的函数一次。

为了简短回答我会解释:

当链接DLL或共享库时,没有副本,你的程序必须将链接库或DLL加载到内存中,如果它尚未加载,并从中调用函数,静态库是不同的,因为没有依赖运行时,所以每个使用过的函数都被复制到可执行文件中。

有一个例外,inline函数可以为每次使用复制,但不作为函数复制,而是作为代码复制。在代码调用函数的地方复制了函数代码(或多或少)。它由编译器完成,而不是由链接器完成。

inline函数是有保证的,它就像对编译器的推荐。当你将函数声明为内联时,通常将代码放在头文件中。即使没有说明,编译器也可以将函数inline确定为优化,并且可能在函数非常短的情况下发生。

所以结论与静态lib链接,该函数只被复制一次到可执行文件。