推迟共享库的链接
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()
从库中获取它们。
我明白了。但最初的问题是“有没有办法只用一个头文件来编译一个应用程序”,这意味着这个人想要直接调用函数而不是通过函数指针。
头文件和函数指针不是互斥的。
我完全明白你的意思。我要说的是,我不认为提问者想要这样。我觉得他仍然想按名称调用函数。在编译时(构建时)不指定任何库。我也可能错了:)以上是关于推迟共享库的链接的主要内容,如果未能解决你的问题,请参考以下文章
链接 Yaml-cpp 和 Armadillo 共享库的 CMake 项目