【问题标题】:Compiling shared library for python to distribute为python编译共享库以分发
【发布时间】: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


    【解决方案1】:

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

    我发现,如果我针对本机 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-w-o-attachments-td13183.html

    【讨论】:

    • 编辑了一些附加信息,我让库与 enthought 和系统 python 可靠地工作,并决定自己为psychopy用户分发一个单独的库
    猜你喜欢
    • 2016-09-15
    • 2013-03-28
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    相关资源
    最近更新 更多