CMake:使用静态库的共享库

时间:2010-11-18 22:20:28

标签: c++ linux gcc cmake boost-python

我正在尝试创建一个链接静态库的共享库(实际上是一个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。

1 个答案:

答案 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]