静态和共享库链接器错误

Posted

技术标签:

【中文标题】静态和共享库链接器错误【英文标题】:Static and shared libraries linker error 【发布时间】:2013-04-13 17:31:42 【问题描述】:

我正在使用 NDK(android 的原生编译器工具)。所以,情况是这样的:

Static boost → Shared helpers
                       ↓
                  Shared Game

Helpers 是一些用于游戏开发的共享库。 shared game 是一个包含在 java 代码中的库(作为本地库加载)。 Helpers lib 在内部使用 boost,链接器在这里很好。共享游戏通过 helpers api 使用 boost 但编译失败。

链接器无法解析 boost_system 库中的某些符号。所以,我确实是这样的:

Static boost → Shared helpers
     |                  ↓
     +----------- → Shared Game

现在它编译得很好。怎么了?我认为我可以将 boost 链接到 helpers 并在共享游戏中使用它们。

【问题讨论】:

【参考方案1】:

没有错。正如您所说,您希望shared game 仅使用由shared helpers 动态库导出的shared helpers API。你的错误是shared game 仍然依赖于一些裸露的 Boost API,这些 API 显然不是由 shared helpers 导出的。这就是为什么您也必须将 Boost 显式链接到 shared game,以便正确解析这些 Boost 符号。

如果你想从 Boost API 中完全抽象出来并消除这种依赖,那么你必须通过扩展 shared helpers 来包装这个 Boost API(你需要在 shared game 中)(当然不要忘记也从shared helpers 导出这个包装的 API)。

【讨论】:

以上是关于静态和共享库链接器错误的主要内容,如果未能解决你的问题,请参考以下文章

静态库,链接到共享库

linux ldconfig命令的作用(Linker Configuration 链接器配置)更新动态链接库(共享库)的链接器程序缓存

linux共享库链接过程

静态库和共享库

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

musl 无法将 libc.a 链接到共享库