我目前正在使用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,但看起来它应该是不必要的。关于如何解决这个问题的任何想法?
答案 0 :(得分:2)
在OS X上,使用绝对路径引用依赖库。复制到二进制文件中的路径取决于您在构建时链接的库的所谓“安装名称”。在您的情况下,yara.so
不会引用您希望加载的库。让我们探讨为什么会出现这种情况的几个原因,以及解决这个问题的几种方法:
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号案例。