链接器是否更喜欢.so文件而不是.a文件?

时间:2017-05-17 13:57:38

标签: linker llvm julia ld

我正在使用包含libLLVM * .so文件和相应的libLLVM * .a文件的本地LLVM构建来构建Julia。这是首先使用BUILD_SHARED_LIBS=ON构建的,它负责存在libLLVM * .so文件。

libjulia.so,julia可执行文件使用的库,始终链接到libLLVM * .so 文件,即使我使用BUILD_SHARED_LIBS=OFF重建LLVM(默认情况下)配置)。 llvm-config --libs $LIB带有和不带BUILD_SHARED_LIBS=ON的输出变化不大,似乎没有任何暗示llvm-config发出链接选项,指示链接器链接* .so文件或* .a文件。

为什么会这样?是否存在使用.so文件的链接器的默认行为,即使存在同名的.a文件?或者,是否有Julia重用的构建配置缓存?

1 个答案:

答案 0 :(得分:4)

是的,要完成选项-lfoold默认会将libfoo.so优先于libfoo.a -static 可以在同一个搜索目录中找到,当它找到任何一个时 不会再看了。

只有将libfoo.a传递给链接,才能强制实施静态库的链接, 但在这种情况下,必须为所有库找到静态版本 - 包括 默认系统库 - 不仅仅是您明确提到的那些。

有选择地链接静态库-static,而不指定-l, 您可以使用-l:libfoo.a选项的显式形式:-lfoo而不是 llvm-config

无论您是否构建,

-lfoo都会以ld形式发出库选项 静态或共享库,因为这些选项可以正常工作 或者,但是你需要了解何时使用链接器 行为方式。如果你不这样做,它将链接共享 而面对选择的静态库。

<强>后来

  

为什么ld更喜欢将共享库链接到静态库?

AFAIK,Applications/MAMP/bin/php/php5.5.38/的开发人员做出这个决定的原因并未记录在案 之前,但原因很明显:如果动态链接是默认的话 默认情况下,可执行文件不会在物理上包含其他代码副本 可以通过共享库中的单个共享副本提供给所有可执行文件。从而 默认情况下,可执行文件将节省其代码大小和聚合 构成你的系统或我的系统的可执行文件将远远小于 它必须没有分享。共享库和动态链接 发明了这样,系统不需要用重复的代码来膨胀。

动态链接带来了可执行文件的复杂性 链接到共享库,当分发到除以外的系统 构建它的一个,不带有它的动态依赖。它&#39; S 因此,所有已批准的安装新二进制文件的机制 在系统上 - 包管理器 - 确保它们的所有动态依赖关系 也安装了。