我正在尝试创建一个链接静态库的共享库(实际上是一个Python模块)。这两个库都是同一个项目的一部分,并使用cmake构建。
现在,共享库的构建如下:
add_library(MyLibPython SHARED ${PYTHON_WRAPPERS_SRC})
set_target_properties(MyLibPython PROPERTIES PREFIX "")
target_link_libraries(MyLibPython MyLibStatic ${LIBS})
这种构建没有错误,但是当我尝试导入Python模块时,我得到:
ImportError: lib/python/MyLibPython.so: undefined symbol: _Zone_of_my_MyLibStatic_functions
我还有许多以类似方式构建的可执行文件(单元测试),它们运行良好。
我应该补充一点,这是在Linux上使用gcc。
答案 0 :(得分:2)
检查链接器命令行。它传递的是-Wl,--as-needed
之类的东西吗?如果是这样,它可能不包括静态库所需的所有内容。
我认为你的技术一般都不便携。你能获得一个链接的共享库吗?我认为有些平台需要将所有进入共享库的内容编译为PIC。
无论如何,要将整个档案链接到GNU ld(查找man ld
):
gcc -o foo foo.o bar.o baz.o -Wl,--whole-archive libfoo.a -Wl,--no-whole-archive [rest-of-linker-args]