PyPy не работает на MacOS 10.9.5
Я пытаюсь установить PyPy на MacOS 10.9.5. В качестве первой попытки я скачал архив с двоичными файлами прямо с официального сайта, распаковал его и запустил 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
Поэтому я попытался установить OpenSSL с sudo port install openssl
но ошибка осталась. Я также попытался установить Pypy через sudo port install pypy
но я получил ту же ошибку.
Любая помощь?
1 ответ
Это распространенное заблуждение в macOS - на библиотеки в macOS ссылаются не только по имени, но и по абсолютному пути. По этой причине MacPorts OpenSSL, установленный в / opt /local, не отвечает требованиям библиотеки, поставляемой с PyPy, поскольку ожидает библиотеку в / usr /local / opt / openssl.
Я цитирую письмо от себя в списке пользователей macports несколько дней назад, которое объясняет детали:
На библиотеки macOS ссылаются из двоичных файлов, используя их абсолютный путь.
На техническом уровне, когда вы связываете двоичный файл, например, с -lcurl в командной строке, компоновщик найдет libcurl.dylib в путях поиска, которые вы указали в командной строке (это должно быть -L/opt/local/lib для использования с MacPorts). Затем он будет читать идентификатор библиотеки из файла. Для нашего примера libcurl от MacPorts это:
$> otool -D /opt/local/lib/libcurl.dylib /opt/local/lib/libcurl.4.dylib
Этот путь затем будет скопирован в связанный двоичный файл. Вы можете проверить это с помощью бинарного файла MacPorts:
$> 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.