来自静态库的共享库依赖导致未定义的符号错误
Shared library dependency from static library results in undefined symbol error
在我的项目中,我有以下代码结构:
src/
simulator/
core/
gui/
...
我在 Linux。我需要为 simulator
文件夹创建一个共享库,它应该包含来自 core
和 gui
文件夹的静态库; 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 个实例的布局
动态库未规范化,可能会导致一些问题。
在我的项目中,我有以下代码结构:
src/
simulator/
core/
gui/
...
我在 Linux。我需要为 simulator
文件夹创建一个共享库,它应该包含来自 core
和 gui
文件夹的静态库; 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 个实例的布局 动态库未规范化,可能会导致一些问题。