【发布时间】:2013-07-15 05:06:12
【问题描述】:
我正在将一个 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”编译。似乎不同的发行版具有略微不同的链接器符号,并且东西开始中断
最常见的问题是它使用Fatal Python error: PyThreadState_Get: no current thread 使python 内核崩溃(根据:this question,表示链接不兼容)。我可以让我的库在它编译的 python 中工作。
不幸的是,这个库是供学术实验室使用的,里面有各种不同年龄和操作系统的计算机,其中许多已永久弃用,以便运行多年未更新的专有软件,我当然不这样做'没时间玩IT并修复所有这些问题,目前我刚刚针对最新的 Enthought 发行版附带的 python 版本进行编译,因为大多数计算机都可以通过一种或另一种方式获得它。与我一起工作的许多研究人员都使用一些特定于他们领域的 python IDE,这些 IDE 带有内置的解释器,但不可修改,也不是框架构建(所以我不能针对它构建),暂时,他们可以在 Enthought 中运行他们的实验脚本作为权宜之计,但这并不理想。即使我链接到与内置 IDE python 版本相同的 python.org 发行版(我认为是 2.7.2,它甚至具有相同的该死的版本号),它仍然以相同的方式中断。
在任何情况下,问题是,有没有办法链接一个 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")
当使用otool 检查链接库时,这会导致@rpath 符号路径,似乎与其他OSX 系统上的enthought/canopy 一起工作正常,-lpython 似乎是可选的,它在其中添加了一个额外的python 符号对 osx python(不是系统 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 和系统 python
这些都不适用于带有psychopy 的捆绑python,这是目标环境,针对捆绑的python 进行编译适用于psychopy,但不适用于其他python。
【问题讨论】:
标签: python macos linker swig software-distribution