我正在将一个 SWIG 包装的 C++ 库编译成一个 python 模块,理想情况下,它应该可以分发给个人,以便像模块一样透明地使用该库。我在 OSX 10.8.2 上使用 cmake 和 swig 构建库(系统框架 - Apple python2.7.2,已安装框架 - python.org python 2.7.5)
我遇到的问题是,在与框架链接后,编译的库对正在运行的 python 版本非常有选择性,即使otool -L
显示它是用“兼容性版本 2.7.0”编译的。似乎不同的发行版具有略微不同的链接器符号,并且东西开始中断
最常见的问题是它使 python 内核崩溃Fatal Python error: PyThreadState_Get: no current thread
(根据:this question,表示链接不兼容)。我可以让我的库在它编译的 python 中工作。
不幸的是,这个库是供学术实验室使用的,有各种不同年龄和操作系统的计算机,其中许多已经永久弃用,以便运行多年未更新的专有软件,我当然没有时间玩 IT 并修复所有这些问题,目前我一直在针对最新的 Enthought 发行版附带的 python 版本进行编译,因为大多数计算机都可以通过一种或另一种方式获得它。与我一起工作的许多研究人员都使用了一些特定于他们领域的 python IDE,这些 IDE 带有内置的解释器,但不可修改,也不是框架构建(所以我不能针对它构建),目前,他们可以在 Enthought 中运行他们的实验脚本作为权宜之计,但这并不理想。即使我链接到python。
在任何情况下,问题是,有没有办法链接一个 SWIG 包装的 python 库,以便它可以运行(至少在 OSX 上),无论是什么解释器正在导入它(给定某些最低条件,比如保证 >=2.7 .0)。
编辑
在 cmake 中使用以下链接器标志针对 canopy/python 安装版本进行编译
set (CMAKE_SHARED_LINKER_FLAGS "-L ~/Library/Enthought/Canopy_32bit/User/lib -ldl -framework CoreFoundation -lpython2.7 -u _PyMac_Error ~/Library/Enthought/C\
anopy_32bit/User/lib")
这会导致在检查链接库时出现@rpath 符号路径otool
,似乎在其他 OSX 系统上与 enthought/canopy 一起工作正常,这-lpython
似乎是可选的,它在库引用中添加了一个额外的 python 符号对 osx python(不是系统蟒蛇)
使用以下链接器标志针对系统 python 进行编译
set (CMAKE_SHARED_LINKER_FLAGS "-L /Library/Frameworks/Python.framework/Versions/Current/lib/python2.7/config -ldl -framework CoreFoundation -u _PyMac_Error /Library/Frameworks/Python.framework/Versions/Current/Python")
适用于enthought和system python
这些都不适用于带有psychopy的捆绑python ,这是目标环境,针对捆绑的python进行编译适用于psychopy,但没有其他python。