我目前使用的是 Python.org 的 Python 3.4 Mac OS X 版本。我使用的 Python 模块依赖于我在 Macports 中构建的库。该脚本不能立即运行:
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。当它应该在 /opt/local/lib
中查找时,它却一直在 /usr/local/lib
中查找。
copying /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/yara.so -> build/exe.macosx-10.6-intel-3.4/yara.so copying /usr/local/lib/libyara.3.dylib -> build/exe.macosx-10.6-intel-3.4/libyara.3.dylib error: [Errno 2] No such file or directory: '/usr/local/lib/libyara.3.dylib'
我也许可以在 Macports 中构建 Python,但这似乎是不必要的。关于如何解决这个问题有什么想法吗?
最佳答案
在 OS X 上,使用绝对路径引用依赖库。复制到二进制文件中的路径取决于您在构建时链接的库的所谓“安装名称”。在您的情况下,yara.so
没有引用您希望加载的库。让我们探讨一下出现这种情况的几个原因,以及解决这个问题的几种方法:
- 我已验证 MacPorts(在我的系统上)安装的
libyara.dylib
的安装名称为/opt/local/lib/libyara.0.dylib
。有时,构建不使用跨平台库构建工具的系统,并且不希望 OS X 的特性将其搞乱(并使用相对路径或/usr/local/lib
)。如果是这种情况,这将是软件构建系统中的一个错误,可以使用install_name_tool(1)
的-id
标志手动修复该错误(在链接到图书馆)。 - 您的
yara.so
副本可能是针对驻留在/usr/local/lib
中的不同版本的libyara.dylib
构建的>。这可以解释为什么您的yara.so
不包含libyara.dylib
的 MacPorts 副本的正确绝对路径,但它也可以防止您看到的错误首先发生的情况是,除非您在构建时在/usr/local/lib
中有一个副本并随后将其删除。正如您已经看到的,您可以指示 OS X 的加载程序使用DYLD_*
系列环境变量搜索不同的路径。我认为这对cx_freeze
不起作用的原因是它不关注DYLD_*
系列变量。 - 如果您确定在
/usr/local/lib
中找到的libyara.dylib
yara.so
副本是二进制文件- 与/opt/local/lib
中的兼容,您可以使用install_name_tool手动修改
的yara.so
中的库加载命令以指向后一个路径(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。这本质上是在设置 DYLD_FALLBACK_LIBRARY_PATH 时使用加载程序为您所做的更改来修改二进制文件。由于库的主要版本号似乎不同,这可能不是一个安全的假设。 - 如果您不知道
yara.so
是否与 MacPorts 的libyara.0.dylib
版本兼容,您可以而且应该重新编译yara。所以。如果重新编译成功,您应该能够使用
otool -L yara.so
检查库加载命令,并查看以/opt/local
开头的路径那里(前提是otool -D/opt/local/lib/libyara.0.dylib
正确指向自身)。
编辑:我刚刚重新检查并注意到我的 MacPorts 版本的库版本号与您的系统期望的版本号不同。对我来说,这听起来很像案例 2。
关于python - 我应该如何将 cx_freeze 与 Macports 库一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30728006/