推迟共享库的链接

Posted

技术标签:

【中文标题】推迟共享库的链接【英文标题】:Deferring linking of shared libs 【发布时间】:2012-05-23 16:53:23 【问题描述】:

如果我在 linux 中使用共享库,如果应用程序必须在运行时找到该库,为什么我需要将它与 -l 链接?

难道我不能在链接步骤中使用正确的函数签名传入一个虚拟 .so 并在运行时将其替换为真实的 .so 并且仍然可以正常工作吗?

有没有办法只用头文件编译应用程序并在运行时进行链接?

【问题讨论】:

差不多。只要它公开了所有相关的符号信息。 在 Windows 上,您有一个用于链接器的 .lib 文件和一个用于代码的 .dll 文件。一个 .so 文件恰好将这两种信息存储在一个地方。 【参考方案1】:

如果我在 linux 中使用共享库,如果应用程序必须在运行时找到该库,为什么我需要将它与 -l 链接?

以便加载器知道哪些库必须在运行时加载。

难道我不能在链接步骤中使用正确的函数签名传入一个虚拟 .so 并在运行时将其替换为真实的 .so 并且仍然可以正常工作吗?

绝对的。

有没有办法只用头文件编译应用程序并在运行时进行链接?

是的,但是有责任自己调用dlopen(3)dlsym(3) 来加载库和函数。

【讨论】:

>> 这不会导致关于缺少符号的编译时警告吗?使用 dlopen 您不能直接按名称引用符号。 @Saurabh:您为符号创建static 占位符,然后使用dlsym() 从库中获取它们。 我明白了。但最初的问题是“有没有办法只用一个头文件来编译一个应用程序”,这意味着这个人想要直接调用函数而不是通过函数指针。 头文件和函数指针不是互斥的。 我完全明白你的意思。我要说的是,我不认为提问者想要这样。我觉得他仍然想按名称调用函数。在编译时(构建时)不指定任何库。我也可能错了:)

以上是关于推迟共享库的链接的主要内容,如果未能解决你的问题,请参考以下文章

Autotools:是不是可以进行共享库的交叉链接

Qt 共享库(动态链接库)和静态链接库的创建及调用

链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目

我需要列出在 UNIX/Linux 中具有链接到它们的指定共享库的程序(如 ldd,反之亦然)

C 库的 C++ 包装器作为共享库

共享库如何免受利用?