【问题标题】:Shared library dependency from static library results in undefined symbol error来自静态库的共享库依赖导致未定义符号错误
【发布时间】:2020-01-10 04:56:40
【问题描述】:

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

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:未定义符号:_ZTIN9simulator4core9someClassE

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

nmed 静态和动态库。该符号在静态库 (simulatorcore.a) 中使用 B 指定,在共享库 (simulator.so) 中使用“U”指定。

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

SHLIB = simulator

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

但这是我最后的手段,所以我想为我的问题找到一个解决方案。

【问题讨论】:

    标签: linux dependencies shared-libraries static-libraries linker-errors


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2021-07-08
      相关资源
      最近更新 更多