C++静态库

Mik*_*ike 0 c++ dll linker shared-libraries static-libraries

除了包含第三方软件之外,为什么要为项目创建静态库.如果您自己编写源代码,那么您可以将其构建为项目的一部分,如果它是一个不止一次使用的库,那么动态链接和坐在运行时库上会不会更有意义?

Max*_*kin 5

动态库由于重定位而具有运行时成本†因为在运行时之前,库的基本和相对加载地址是未知的.也就是说,对动态库的函数调用和变量访问是间接的.因此,必须将共享库的代码编译为与位置无关的代码(-fPICflag in gcc).

而使用静态库,即使使用地址空间随机化,也可以使用更便宜的程序计数器相对访问,因为链接器可以使用该静态库(目标文件)的相对位置.

请注意,通过vtable(动态链接器可以在加载时修补)来解析对虚函数的调用,因此无论函数驻留在何处,调用虚函数的成本始终相同.(IIRC,我可能需要仔细检查这个陈述).

有关详细信息,请参阅Ulrich Drepper如何编写共享库.


链接到共享库更容易,因为它们包含它们所依赖的其他共享库的列表.

当链接到静态库时,还必须明确链接该静态库的依赖关系(因为a .a只是一堆.o文件).

构建系统应该对静态库进行额外处理,这样用户每次链接时都不必列出静态库依赖项.

链接到静态库时,链接器仅从解析任何未解析的符号中提取这些.o文件.a,而在运行时加载整个共享库.因此,如果你在.o带有构造函数/析构函数的副作用中有一个全局对象,那么除非链接了全局对象,否则静态库不会发生这些副作用.必须特别注意确保全局对象始终链接在.

当链接到驻留在非标准位置的共享库时,还-L<path>必须指定-Wl,-rpath=<path>运行时链接器在那里找到共享库和/或使用-Wl,如果共享库是-rpath = $ ORIGIN附带可执行文件.必须设置LD_LIBRARY_PATH是一种错误的方式.


什么是PLT/GOT?