2010-11-18 152 views
0

我想创建一个共享库(真正的Python模块),链接到一个静态库。这两个库都是同一个项目的一部分,并使用cmake构建。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

你们是不是要链接到的boost :: Python的静态:

无论如何,与GNU LD(查找man ld)的整个存档链接?或者你是静态链接到包装库?如果前者:在这里看到我的答案:http://stackoverflow.com/questions/4120169/msvc-boostpython-static-linking-to-dll-pyd – 2010-11-19 17:04:02

+0

这是后者。但是,感谢你的链接,有趣的是阅读静态链接到提升python并不总是工作... – Krumelur 2010-11-20 11:32:00

回答

2

检查您的链接器命令行。它是否传递类似-Wl,--as-needed?如果是这样,它可能不包括静态库所需的所有内容。

我不认为你的技术是一般的便携式。你可以得到一个共享库链接?我认为有些平台需要将所有进入共享库的平台编译为PIC。

gcc -o foo foo.o bar.o baz.o -Wl,--whole-archive libfoo.a -Wl,--no-whole-archive [rest-of-linker-args] 
+0

不幸的是我没有shred库。我可能直接将目标文件重新链接,但这需要大量重写构建脚本,我希望避免这种情况。 – Krumelur 2010-11-20 11:39:07

+0

@Krumelur:不过,请检查您的链接器命令行。 – 2010-11-20 19:55:17

+0

链接整个存档作品。问题似乎是,当链接.so文件时,即使静态库中的代码引用静态库,也不会包含静态库。看起来ld假设可执行文件(在这种情况下是python)将链接到与.so相同的静态库。 – Krumelur 2010-11-21 13:42:21