1

我正在将一个 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。

4

1 回答 1

0

我遇到了同样的错误/遇到了同样的问题。如果您找到了解决方案,我会很感兴趣。

我发现如果我针对本机 python 包含目录进行编译并运行本机 OS X python 二进制文件/usr/bin/python,它总是可以正常工作。即使我针对其他一些 python 库(比如我在 找到的那个/Applications/Canopy.app/appdata/canopy-1.0.3.1262.macosx-x86_64/Canopy.app/Contents/include)进行编译,我也可以让本机 OS X 解释器正常工作。

我似乎永远无法让 Enthought 版本正常工作。您正在编译哪个目录以与 Enthought/Canopy 一起使用?

在安装时配置 SWIG 以了解特定的 python 库似乎还有一些问题,但这可能不相关:http ://swig.10945.n7.nabble.com/SWIG-Installation-mac-osx-10 -8-3-Message-wo-attachments-td13183.html

于 2013-07-29T23:08:31.800 回答