1

我有:

  • 应用A
  • 动态库D
  • 静态库S

在哪里:

  • A 在编译时与静态库 S 链接。
  • D 编译时不链接 S,但使用它的头文件
  • A 用于dlopen在运行时加载 D。

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

其他注意事项:我需要 D 和 A 都能够从 S 调用函数。理想情况下,我不想更改 S。

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

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

我想这可能是:

  1. 共享库无法使用现有函数“myFunction(int)”(安全性?)
  2. 此函数的符号名称以不同的方式命名(编辑:测试extern "C"并排除了这一点)。

也许我需要使用不同的设置进行编译,或者我必须始终将所有 S 链接到 D?如果 S 本身成为动态库,情况也会改变吗?

谢谢

4

1 回答 1

2

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

于 2012-07-15T15:05:33.307 回答