我试图在MacOS 10.9.5上安装PyPy。
作为第一次尝试,我直接从官方网站下载了包含二进制文件的tarball,将其解压缩并在bash中启动pypy
。我明白了:
dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib
Referenced from: /Users/<MY_USER>/opt/pypy2-v5.10.0-osx64/bin//libpypy-c.dylib
Reason: image not found
Trace/BPT trap: 5
所以我尝试使用sudo port install openssl
安装openssl,但错误仍然存在。我也试过通过sudo port install pypy
安装pypy,但我得到了同样的错误。
任何帮助?
答案 0 :(得分:1)
这是对macOS的常见误解 - macOS上的库不仅仅通过名称引用,而是通过绝对路径引用。因此,安装在/ opt / local中的MacPorts OpenSSL不能满足PyPy附带的库的要求,因为它需要/ usr / local / opt / openssl中的库。
我几天前在macports-users列表中引用了自己发来的电子邮件,其中详细解释了:
使用绝对路径从二进制文件引用macOS库。
在技术层面,当您将二进制文件与例如-lcurl链接时 在命令行中,链接器将在搜索路径中找到libcurl.dylib 您在命令行上给出了(应该是-L / opt / local / lib以供使用) 与MacPorts)。然后它将从文件中读取库id。对于我们 MacPorts的例子&#39; libcurl,这是:
$> otool -D /opt/local/lib/libcurl.dylib /opt/local/lib/libcurl.4.dylib
然后将此路径复制到链接的二进制文件中。你可以验证这一点 使用MacPorts curl二进制文件:
$> otool -L /opt/local/bin/curl | grep libcurl /opt/local/lib/libcurl.4.dylib (compatibility version 10.0.0, current version 10.0.0)
当您运行/ opt / local / bin / curl时,加载程序将读取此表并进行定位 此文件使用其绝对路径。设置DYLD_LIBRARY_PATH会覆盖它 并尝试在目录中找到具有给定basename的文件 在DYLD_LIBRARY_PATH中给出,但是如果库和二进制文件已经存在 正确构建(而不是移动)你永远不必设置它。
当然,这会使您的二进制文件不可重定位。如果你想重新安置 二进制文件,您可以使用特殊变量@loader_path使用相对路径, @executable_path和@rpath。请参阅dylibbundler端口 如果使用-headerpad_max_install_names构建二进制文件,则会自动执行此操作 链接器标志(MacPorts默认执行此操作)。
要解决您的问题,您可以设置DYLD_FALLBACK_LIBRARY_PATH并希望这些库是二进制兼容的(它们可能是也可能不是)或使用install_name_tool -change
(它在文件而不是环境中执行相同的操作) 。但是,你应该问问谁给你这个二进制文件他们希望你如何运行它以及从哪里获得匹配的OpenSSL库。