来自静态库的共享库依赖导致未定义的符号错误

Shared library dependency from static library results in undefined symbol error

在我的项目中,我有以下代码结构:

src/
    simulator/
        core/
        gui/
        ...

我在 Linux。我需要为 simulator 文件夹创建一个共享库,它应该包含来自 coregui 文件夹的静态库; simulator.so = simulatorcore.a + simulatorgui.a + ....

我正在使用某种自定义格式的 makefile,这就是我指定依赖项的方式:

simulator/Makefile.make - 应该生成共享库

SHLIB = simulator

SHLIB_DEPS_simulator = \
    src/simulator/core/lib_simulatorcore \
    src/simulator/gui/lib_simulatorgui
    ...

simulator/core/Makefile.make - 应该生成静态库

LIB = simulatorcore

LIB_DEPS_simulatorcore =    \
    SimulatorData.o    \
    ...

代码编译但出现此错误:

libsimulator.so: undefined symbol: _ZTIN9simulator4core9someClassE

我知道链接顺序对 gcc 很重要,但是当我更改静态库的顺序(我将其指定为共享库文件的依赖项)时,我得到另一个未定义的符号,这次它说找不到静态成员定义。

nm编辑了静态库和动态库。该符号在静态库 (simulatorcore.a) 中用 B 指定,在共享库 (simulator.so) 中用 'U' 指定。

实际上,当我像这样用目标文件指定共享库依赖项时,它工作正常:

SHLIB = simulator

SHLIB_DEPS_simulator = \
    ./core/SimulatorData.o \
    ...

但这是我最后的选择,所以我想找到解决问题的方法。

以下线索可能对您有所帮助:

  • 您是否正在生成可重定位输出(gcc 的 -r 选项)?您的 静态库符号需要转发给链接器,所以 所谓的 "Partial linking" 可能有助于解决您的问题。
  • 你的 "B" 看起来很奇怪所以我。 "B" 用于未初始化的数据
    可执行文件的数据部分。您是否要导出一些全局 class 来自 .so 的实例而不仅仅是函数("text" 中的代码 部分:"T")?据我所知,用于导出 class 个实例的布局 动态库未规范化,可能会导致一些问题。