我正在尝试在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,但我得到了同样的错误。
有帮助吗?
这是对macOS的常见误解 - macOS上的库不仅仅通过名称引用,而是通过绝对路径引用。因此,安装在/ opt / local中的MacPorts OpenSSL无法满足PyPy附带的库的要求,因为它需要/ usr / local / opt / openssl中的库。
我几天前在macports-users列表上引用了自己的电子邮件,其中详细解释了:
使用绝对路径从二进制文件引用macOS库。
在技术层面,当您在命令行上将二进制文件与例如-lcurl链接时,链接器将在您在命令行上给出的搜索路径中找到libcurl.dylib(应该是-L / opt / local / lib用于MacPorts)。然后它将从文件中读取库id。对于我们的MacPorts的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会覆盖它并尝试在DYLD_LIBRARY_PATH中给出的目录中找到具有给定基本名称的文件,但如果库和二进制文件已正确构建(并且未移动),则永远不必设置它。
当然,这会使您的二进制文件不可重定位。如果要重定位二进制文件,可以使用特殊变量@loader_path,@ executable_path和@rpath来使用相对路径。请参阅dylibbundler端口,如果您使用-headerpad_max_install_names链接器标志(MacPorts默认情况下)生成二进制文件,则会在很大程度上自动执行此操作。
要解决您的问题,您可以设置DYLD_FALLBACK_LIBRARY_PATH并希望这些库是二进制兼容的(它们可能是也可能不是)或使用install_name_tool -change
(它在文件而不是环境中执行相同操作)。但是,你应该问问谁给你这个二进制文件他们希望你如何运行它以及从哪里获得匹配的OpenSSL库。