我有:
- 应用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
我想这可能是:
- 共享库无法使用现有函数“myFunction(int)”(安全性?)
- 此函数的符号名称以不同的方式命名(编辑:测试
extern "C"
并排除了这一点)。
也许我需要使用不同的设置进行编译,或者我必须始终将所有 S 链接到 D?如果 S 本身成为动态库,情况也会改变吗?
谢谢