静态和动态链接库

问题描述:

我对链接库有一些问题。静态和动态链接库

连接器如果决定,如果我想链接的库链接静态或动态?是否由文件扩展(.a/ .so)决定?

是否有可能动态链接.a库?

是否有可能将.a库转换为.so库而不需要源代码?

+3

是的,不,不。您通常需要编译代码*独立位置*以使其可用作共享库;除非明确要求,否则通常不会这样做。 –

+0

@KerrekSB这难道不是答案吗? – delnan

  1. 链接器通过查看扩展名来决定如何链接库,但这很大程度上取决于链接器。 AIX链接器有一些相当奇特的行为。此外,如果同一位置同时存在.so和.so两个版本的库,则命令行开关会让您确定使用哪个链接器。
  2. 排序。您可以将.a链接到.so,但会有性能问题 - 共享库应该使用与位置无关的代码来构建,以获得最佳性能。根据代码,链接器可能会拒绝链接它,因为它无法修补重定位信息。但是你不能告诉链接器把.a当作一个.so
  3. 如上 - 也许。

默认情况下,如果在其搜索路径中找到两种类型的库,gcc链接程序将动态链接到.so文件。你可以用命令行参数来覆盖它,如here所述。