运行时共享库​​可以调用现有符号吗?

时间:2012-07-14 21:31:07

标签: c++ symbols dylib

我有:

  • 申请 A
  • 动态库 D
  • 静态库 S

其中:

  • A在编译时与静态库S链接。
  • 编译时没有链接S,但使用其头文件
  • A使用dlopen在运行时加载D.

D在A中运行时是否可以使用S中定义的符号,而D在其编译时没有与S链接?即可以在全局命名空间中访问符号吗?

其他说明: 我需要D和A才能从S调用函数。 理想情况下,我不想改变S。

我已经尝试了这个,我得到了(当在D中使用S的符号时):

dyld: lazy symbol binding failed: Symbol not found: __Z14myFunctioni

我认为这可能是:

  1. 现有函数'myFunction(int)'不可用于共享库(安全性?)
  2. 此功能的符号名称以不同的方式被修改了名称(编辑:使用extern "C"测试并排除了这一点。)
  3. 也许我需要使用不同的设置进行编译,或者我必须始终将所有S链接到D?如果S成为一个动态图书馆,情况也会改变吗?

    三江源

1 个答案:

答案 0 :(得分:2)

  

使用该库的依赖关系列表中的库以及之前使用RTLD_GLOBAL标志打开的任何其他库来解析库中的外部引用。 如果可执行文件与标记“-rdynamic”(或同义地,“ - export-dynamic”)链接,则可执行文件中的全局符号也将用于动态解析引用装载的图书馆。