我应该如何将cx_freeze用于Macports库?

时间:2015-06-09 09:21:58

标签: python macos macports cx-freeze

我目前正在使用Python.org的Python 3.4 Mac OS X版本。我使用的是依赖于我在Macports中构建的库的Python模块。该脚本不会开箱即用:

Traceback (most recent call last):
  File "magnetx.py", line 6, in <module>
    import yara
ImportError: dlopen(/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so, 2): Library not loaded: /usr/local/lib/libyara.3.dylib
  Referenced from: /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so
  Reason: image not found

如果我设置了一个环境变量

,我可以解决这个问题
export DYLD_FALLBACK_LIBRARY_PATH="/opt/local/lib:$DYLD_FALLBACK_LIBRARY_PATH"

不幸的是,它不满足cx_freeze。它会继续查看/usr/local/lib,它应该在/opt/local/lib查看。

  

复制   /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so    - &GT; build / exe.macosx-10.6-intel-3.4 / yara.so copy /usr/local/lib/libyara.3.dylib - &gt;   build / exe.macosx-10.6-intel-3.4 / libyara.3.dylib错误:[Errno 2]否   这样的文件或目录:&#39; /usr/local/lib/libyara.3.dylib'

我可能在Macports中构建Python,但看起来它应该是不必要的。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

在OS X上,使用绝对路径引用依赖库。复制到二进制文件中的路径取决于您在构建时链接的库的所谓“安装名称”。在您的情况下,yara.so不会引用您希望加载的库。让我们探讨为什么会出现这种情况的几个原因,以及解决这个问题的几种方法:

  • 我已经确认MacPorts(在我的系统上)安装的libyara.dylib的安装名称为/opt/local/lib/libyara.0.dylib。有时,构建不使用跨平台库构建工具的系统,并且不要指望OS X的特性搞砸了(并使用相对路径或/usr/local/lib)。如果是这种情况,那么它将是软件构建系统中的一个错误,可以使用install_name_tool(1)的{​​{1}}标志手动修复(在链接库之前)。
  • 您的-id副本可能是根据yara.so中不同版本的libyara.dylib构建的。这可以解释为什么您的/usr/local/lib不包含yara.so的MacPorts副本的正确绝对路径,但它也可以防止您首先看到的错误发生,除非您有在构建时复制libyara.dylib并稍后将其删除。正如您已经看到的,您可以指示OS X的加载程序也使用/usr/local/lib系列环境变量搜索不同的路径。我认为这对DYLD_*不起作用的原因在于它没有关注cx_freeze系列变量。
  • 如果您确定DYLD_* libyara.dylib期望在yara.so中找到的副本与/usr/local/lib中的副本兼容,则可以手动修改该库使用/opt/local/lib的{​​{1}}参数加载yara.so中的命令以指向后一个路径,例如install_name_tool(1)。当你设置-change old new时,这基本上是修改加载器为你做的更改。由于库主要版本号似乎不同,这可能不是一个安全的假设。
  • 如果您不知道install_name_tool -change /usr/local/lib/libyara.3.dylib /opt/local/lib/libyara.0.dylib /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so是否与MacPorts的DYLD_FALLBACK_LIBRARY_PATH版本兼容,您可以而且应该重新编译yara.so。如果重新编译正确,您应该能够使用libyara.0.dylib检查库加载命令,并在那里查看以yara.so开头的路径(前提是otool -L yara.so正确指向自身)

编辑:我刚刚重新检查并注意到我的MacPorts版本的库版本号与系统预期的版本号不同。这听起来很像我的第2号案例。