2017-05-17 42 views
3

我使用包含libLLVM * .so文件和相应的libLLVM * .a文件的本地LLVM构建Julia。这是由BUILD_SHARED_LIBS=ON构建的,它负责libLLVM * .so文件的存在。链接器是否比.a文件更喜欢.so文件?

libjulia.so,由julia可执行程序使用的库,总是与libLLVM *。所以文件,甚至当我重建LLVM与BUILD_SHARED_LIBS=OFF(默认配置)。 llvm-config --libs $LIB的输出有和没有BUILD_SHARED_LIBS=ON没有太大的差异,似乎没有什么暗示llvm-config发出链接选项,指示链接器链接* .so文件或* .a文件。

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

回答

4

是,履行选项-lfoold将默认链接libfoo.so优先于libfoo.a如果两个 在同一个搜索目录中找到,并在找到任何一个它 将没有进一步看。

只能通过传递-static的联动, 但在这种情况下,静态版本必须为所有库中找到执行静态库联动 - 包括 默认的系统库 - 不只是那些你明确提及。

要选择链接静态库libfoo.a,而不指定-static, 可以使用-l选项的明确形式:-l:libfoo.a而非 -lfoo

llvm-config会散发出库选项在-lfoo形式是否建立 静态或共享库,因为这些选项可以正常工作了 下去,但你需要使用这些链接器如何 的行为时,理解。如果你没有告诉它,它会链接共享,而不是静态库时,它面临的选择 。

后来

为什么LD喜欢共享库在静态的链接?

据我所知,它不记录为何ld开发商长期 前做出这个决定,但原因是显而易见的:如果动态链接是默认然后 可执行文件,默认情况下,不会实际包括其他副本代码 可以通过共享库从单个共享副本提供给所有可执行文件。因此, 可执行文件在默认情况下将节省其代码大小,构成您系统或我的系统的可执行文件的总和将远远小于它必须不共享的 。共享库和动态链接 被发明出来,因此系统不需要被重复代码臃肿。

动态链接带来了与共享库链接的可执行文件,当它被分发到系统之外的其他系统时,并不是它的动态依赖关系的复杂性。这是 出于这个原因,所有的系统上安装新的二进制文件 批准的机制 - 包管理器 - 确保所有的动态依赖 的安装为好。

+0

感谢您的回答!为什么'ld'喜欢共享库在静态的链接? – kesari

+0

@kesari更新答案 –