在编译时链接共享对象

时间:2011-02-12 04:17:28

标签: linux gcc linker shared-libraries compile-time

在Windows中,许多.dll都带有静态的.lib对应物。我的理解是.lib对应物基本上包含LoadProcAddress调用,这样程序员就不必自己动手了。基本上,节省时间。当我切换到Linux时,我假设情况是一样的,用.a替换.dll和.lib的.lib,但是我遇到的情况是告诉我这是错的,我无法弄清楚是什么正在进行:

我使用的是一个.a / .so对的库。我正在链接.a,但是当我在生成的二进制文件上执行ldd时,它不包含对相应的.so文件的引用。那么,我尝试链接.so文件,令我惊讶的是,这很有效。另外,当我对生成的二进制文件执行ldd时,.so文件出现了。

所以,我真的很困惑发生了什么。在Windows中,我永远不会想到链接.dll文件。此外,在Windows中,如果.dll文件附带.lib并且我在编译时链接到.lib,那么我希望在运行时依赖于相应的.dll。在这种情况下,这两件事都不正确。

是的,我已经阅读了有关Linux中共享对象的基本教程,但我读到的所有内容似乎表明我的初始假设是正确的。顺便说一句,我应该提到我使用Code :: Blocks作为IDE,我知道这会让事情变得复杂,但是当我告诉它链接到.so文件时,我肯定99%,它不是简单的交换.a文件,因为生成的二进制文件较小。 (加上关于ldd的整个业务......)

无论如何,提前谢谢。

3 个答案:

答案 0 :(得分:1)

  

我正在链接.a,但是当我在生成的二进制文件上执行ldd时,它不包含对相应的.so文件的引用。

这是预期的。静态链接时,静态库的代码将集成到生成的二进制文件中。静态库没有更多的引用或依赖。

  

那么,我尝试链接.so文件,令我惊讶的是,这很有用。

你是什么意思,静态链接不起作用?没有理由不应该......

答案 1 :(得分:1)

.lib在Windows中用于动态链接。您没有在Linux中使用它们,而是直接与.so链接。 .a文件是静态构建的库,您可以使用它静态链接。

答案 2 :(得分:0)

要通过tharibo添加已经正确的答案 - 在某些情况下(例如延迟共享库加载),可能需要以Windows方式执行,即通过链接静态存根而不是.so。这些存根可以手工编写,由项目特定的脚本或通用Implib.so tool生成。