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

时间:2019-09-07 19:22:42

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

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

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很重要,但是当我更改静态库的顺序(我将其指定为共享库文件的依赖项)时,我得到了另一个未定义的符号,这一次它表示一个静态成员找不到定义。

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

实际上,当我用这样的目标文件指定共享库依赖项时,它运行良好:

SHLIB = simulator

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

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

1 个答案:

答案 0 :(得分:0)

以下提示可能会为您提供帮助:

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