Проблемы с установкой GalSim на OSX с Anaconda

Я пытался установить GalSim на OSX 10.9 Mavericks с установленной Anaconda и установленной по умолчанию как python, но столкнулся со следующей ошибкой:

Unable to build a python loadable module using the python executable:
/usr/bin/env python,
the library name libpython2.7.a,
and the libdir //anaconda/lib/python2.7/config.
If these are not the correct library names, you can tell scons the 
correct names to use with the flags EXTRA_LIB_PATH and/or EXTRA_LIBS.

При проверке моих файлов config.log, есть несколько случаев Undefined symbols for architecture x86_64:хотя я убедился, что используемый компилятор clang++, как рекомендовано в FAQ по GalSim.

Есть также многочисленные примеры следующего:

/usr/bin/env python < .sconf_temp/conftest_73 > .sconf_temp/conftest_73.out
Fatal Python error: PyThreadState_Get: no current thread
sh: line 1: 17019 Abort trap: 6           /usr/bin/env python < ".sconf_temp/conftest_73" > ".sconf_temp/conftest_73.out"

Я не уверен, что нужно сделать, чтобы исправить ситуацию. Я переустанавливал Boost несколько раз, используя ./b2 -a Команда для каждого раза после первого. Я убедился, что повышение ссылается /anaconda/bin/pythonи подтвердил это, проверив файлы project-config.jam для каждой установки. Я использовал команды

./bootstrap.sh
./b2 -a toolset=clang cxxflags="-stdlib=libc++" linkflags="-stdlib=libc++" install

как рекомендовано в FAQ по GalSim. Я действительно не уверен, что еще попробовать, кроме попыток переустановить все необходимые пакеты заново. У кого-нибудь есть какие-либо советы о том, что делать, прежде чем я отправлюсь в последний путь? Любая помощь приветствуется.

Ниже приведен результат моего последнего запуска scons:

scons: Reading SConscript files ...
SCons is version 2.3.1 using python version 2.7.6
Python is from //anaconda/include/python2.7
Using the following (non-default) scons options:
   CXX = clang++
These can be edited directly in the file gs_scons.conf.
Type scons -h for a full list of available options.
Using python =  /usr/bin/env python
Using default PYPREFIX =  //anaconda/lib/python2.7/site-packages
Using compiler: /usr/bin/clang++
compiler version: 5.1
Determined that a good number of jobs = 2
Checking for C++ header file fftw3.h... yes
Checking for correct FFTW linkage... yes
Checking for boost header files... yes
Checking for C++ header file TMV.h... yes
Using TMV_LINK file: /usr/local/share/tmv/tmv-link
     -ltmv -lblas
Mac version is 10.9.3
XCode version is 5.1.1
Checking for correct TMV linkage... (this may take a little while)
Checking for correct TMV linkage... yes
Checking if we can build against Python... 
Unable to build a python loadable module using the python executable:
/usr/bin/env python,
the library name libpython2.7.a,
and the libdir //anaconda/lib/python2.7/config.
If these are not the correct library names, you can tell scons the 
correct names to use with the flags EXTRA_LIB_PATH and/or EXTRA_LIBS.

Please fix the above error(s) and rerun scons.
Note: you may want to look through the file INSTALL.md for advice.
Also, if you are having trouble, please check the INSTALL FAQ at 
   https://github.com/GalSim-developers/GalSim/wiki/Installation%20FAQ

3 ответа

Я считаю, что суть проблемы заключается в том, что в библиотеке Python от Anaconda имя установки установлено неправильно. Вот что otool сообщает для этой библиотеки в моей системе:

$ otool -L /anaconda/lib/libpython2.7.dylib 
/anaconda/lib/libpython2.7.dylib:
    libpython2.7.dylib (compatibility version 2.7.0, current version 2.7.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 111.0.0)
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 476.0.0)
    /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

На Mac (в отличие от других разновидностей Unix/Linux) загрузчик во время выполнения просматривает имена установки всех библиотек, которые должны быть загружены в dylib или исполняемый файл. Так как у anaconda здесь не установлен этот параметр правильно, когда GalSim или boost компилируют его, в этой библиотеке просто есть имя файла без каталога. Таким образом, загрузчик не знает, где он, идет искать в нормальных местах и ​​сначала находит версию системы.

Ответ, на который указывает user2932864, в основном меняет порядок поиска во время выполнения, чтобы поместить местоположение anaconda перед системным питоном, поэтому загрузчик находит версию anaconda. Однако это решение не работает так хорошо, если вы хотите, чтобы в вашей системе были доступны оба варианта python. Лучшее решение (IMO) - исправить файл библиотеки anaconda. Для этого просто введите (при условии, что ваша установка anaconda находится в /anaconda):

sudo install_name_tool -id /anaconda/lib/libpython2.7.dylib /anaconda/lib/libpython2.7.dylib 

После этого я смог успешно установить boost (1.53) с

./bootstrap.sh --prefix=$HOME/anaconda_install/ --with-python=/anaconda/bin/python2.7
./b2 link=shared 
./b2 link=shared install

Но тогда повышение имеет ту же проблему. Они также неправильно устанавливают имя установки libboost_python.dylib. Если это единственная форсированная установка в вашей системе, то вы, вероятно, в порядке. Но так как у меня довольно много разных версий, мне пришлось сделать

install_name_tool -id $HOME/anaconda_install/lib/libboost_python.dylib $HOME/anaconda_install/lib/libboost_python.dylib

Затем я смог установить GalSim обычным способом, используя python anaconda:

scons PYTHON=/anaconda/bin/python PREFIX=$HOME/anaconda_install BOOST_DIR=$HOME/anaconda_install
sudo scons install

Да, я считаю, что это связано с нашей базовой логикой RPATH/@dynlib@, над которой мы работаем над обновлением: https://github.com/conda/conda-build/pull/111. Поддержка Linux в настоящее время реализована, OS X и Windows находятся в списке задач.

Майкл - Я думаю, что твоя проблема может быть связана с этой проблемой: ошибка связи Python Boost.Python

Короче говоря, кажется, что boost иногда заявляет, что он связан с Python anaconda, но он действительно связывается с системным Python, несмотря на все это.

На этой странице также есть решение. Это выглядит немного глупо, так что вы можете посмотреть, есть ли у кого-то еще идея. Но если нет, то вы могли бы попробовать это?

Другие вопросы по тегам