链接到静态库时的多个函数调用
Multiple function calls when linking to a static library
在我的 c++ 项目中,我对静态库中的函数进行了多次调用,所以我想知道链接器是否只复制该函数一次,或者每次在源代码中调用它时。
链接器不复制任何东西。当编译器发现它不知道其定义的函数调用时,会将其保留为外部符号。链接器将解析外部符号或抛出链接器错误。
因此,代码中对库方法的每次调用都将转换为 jump to subroutine
,这是代码部分中的地址。
在生成的二进制文件中,这个子程序只存在一次。
希望这能让您更清楚地了解这个主题。
链接器将每个使用的函数复制一次。
为了简短回答,我将解释一下:
链接DLL或共享库时,没有拷贝,你的程序必须将链接库或DLL加载到内存中,如果它还没有加载,并从中调用函数,静态库是不同的,因为没有运行 时的依赖性,因此每个使用的函数都被复制到可执行文件中。
有一个例外,inline
每次使用都可以复制函数,但不是作为函数而是作为代码复制。函数代码(或多或少)被复制到您的代码调用该函数的位置。它是由编译器完成的,而不是由链接器完成的。
inline
功能有保证,给编译器推荐就好了。当您将函数声明为内联时,您通常将代码放在头文件中。即使没有说明,编译器也可能将函数确定为 inline
作为优化,并且它可能出现在函数非常短的地方。
所以结论是链接静态库时,函数只被复制到可执行文件一次。
在我的 c++ 项目中,我对静态库中的函数进行了多次调用,所以我想知道链接器是否只复制该函数一次,或者每次在源代码中调用它时。
链接器不复制任何东西。当编译器发现它不知道其定义的函数调用时,会将其保留为外部符号。链接器将解析外部符号或抛出链接器错误。
因此,代码中对库方法的每次调用都将转换为 jump to subroutine
,这是代码部分中的地址。
在生成的二进制文件中,这个子程序只存在一次。
希望这能让您更清楚地了解这个主题。
链接器将每个使用的函数复制一次。
为了简短回答,我将解释一下:
链接DLL或共享库时,没有拷贝,你的程序必须将链接库或DLL加载到内存中,如果它还没有加载,并从中调用函数,静态库是不同的,因为没有运行 时的依赖性,因此每个使用的函数都被复制到可执行文件中。
有一个例外,inline
每次使用都可以复制函数,但不是作为函数而是作为代码复制。函数代码(或多或少)被复制到您的代码调用该函数的位置。它是由编译器完成的,而不是由链接器完成的。
inline
功能有保证,给编译器推荐就好了。当您将函数声明为内联时,您通常将代码放在头文件中。即使没有说明,编译器也可能将函数确定为 inline
作为优化,并且它可能出现在函数非常短的地方。
所以结论是链接静态库时,函数只被复制到可执行文件一次。