我正在使用包含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重用的构建配置缓存?
答案 0 :(得分:4)
是的,要完成选项-lfoo
,ld
默认会将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 因此,所有已批准的安装新二进制文件的机制 在系统上 - 包管理器 - 确保它们的所有动态依赖关系 也安装了。