2

在 Windows 中,许多 .dll 都带有静态 .lib 对应项。我的理解是 .lib 对应项基本上包含 LoadProcAddress 调用,因此程序员不必自己动手。本质上,节省时间。当我切换到 Linux 时,我假设情况相同,将 .dll 替换为 .so,将 .lib 替换为 .a,但我遇到的情况表明这是错误的,我不知道是什么正在进行:

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

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

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

无论如何,提前谢谢。

4

3 回答 3

1

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

这是意料之中的。当您静态链接时,静态库的代码将集成到生成的二进制文件中。不再有对静态库的引用或依赖。

因此,我尝试链接 .so 文件,令我惊讶的是,这有效。

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

于 2011-02-13T03:55:11.517 回答
1

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

于 2018-02-12T07:28:07.130 回答
0

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

于 2018-02-12T15:01:13.157 回答