在 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的整个业务......)
无论如何,提前谢谢。