nokogiri.so LoadError, возможно, проблема с libiconv на Solaris

Я пытаюсь запустить драгоценный камень Ruby "Nokogiri" на машине Solaris, где у меня нет привилегий root. Что я сделал до сих пор:

  • Я создал свою рубиновую версию (1.9.2p180) в своем домашнем каталоге.
  • попытался установить nokogiri с помощью "gem install nokogiri"

Затем установка драгоценного камня выдала эту ошибку:

Building native extensions.  This could take a while...
ERROR:  Error installing nokogiri:
    ERROR: Failed to build gem native extension.

/home/bender/ruby/bin/ruby extconf.rb
checking for libxml/parser.h... yes
checking for libxslt/xslt.h... yes
checking for libexslt/exslt.h... yes
checking for iconv_open() in iconv.h... no
checking for iconv_open() in -liconv... no
-----
libiconv is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies.

Итак, я скачал и собрал libiconv в /home/myuser/work/libiconv.

$ ls /home/myuser/work/libiconv/
bin      build    include  lib      share

И передал местоположения в качестве аргументов для nokogiri:

gem install nokogiri -- --with-iconv-dir=/home/myuser/work/libiconv --with-iconv-include=/home/myuser/work/libiconv/include --with-iconv-lib=/home/myuser/work/libiconv/lib 

Теперь гем строится, и ошибки не отображаются. Проблема в том, что когда я сейчас пытаюсь его использовать, например. в irb почему-то не загружается:

require 'nokogiri'
LoadError: ld.so.1: ruby: fatal: libiconv.so.2: open failed: No such file or directory - /home/myuser/ruby/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/nokogiri.so
    from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from /home/myuser/ruby/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri.rb:13:in `<top (required)>'
    from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:57:in `require'
    from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:57:in `rescue in require'
    from /home/myuser/ruby/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:35:in `require'
    from (irb):1
    from /home/myuser/ruby/bin/irb:12:in `<main>'

Но когда я ищу файл, который должен отсутствовать, он есть, а также доступен для чтения/исполнения:

ll /home/myuser/ruby/lib/ruby/gems/1.9.1/gems/nokogiri-1.4.4/lib/nokogiri/
total 66
...
-rwxr-xr-x   1 myuser   group      370552 Jun  6 22:53 nokogiri.so
...

Хорошо, и это то, где я застрял.. файл есть, но не может быть открыт? Я попытался восстановить libiconv, который не имел никакого эффекта. Nokogiri не выдает никаких ошибок, указывающих на сбой процесса сборки. Поэтому я не знаю, как это решить, и Google тоже не может дать мне ответы. Я надеюсь, что кто-то здесь может дать мне несколько советов.

/редактировать

Я погуглил еще немного и нашел это сообщение, где кто-то использует ldd для отображения зависимостей. Когда я делаю то же самое для нокогири, он говорит:

ldd /home/myuser/ruby/bin/nokogiri
ldd: /home/myuser/ruby/bin/nokogiri: unsupported or unknown file type

Я предполагаю, что это потому, что это рубиновый файл, но если это актуально, я хочу упомянуть об этом.


person andreas    schedule 06.06.2011    source источник


Ответы (2)


Если вы используете GNU binutils, попробуйте установить

LDFLAGS="-Wl,-rpath /home/myuser/work/libiconv/lib"

если компоновщик Solaris, то что-то вроде -X, точно не помню. Просто проверьте справочную страницу ld для настроек пути выполнения. Это позволит компоновщику во время выполнения найти .so.

person Roman    schedule 06.06.2011
comment
Я не уверен, правильно ли я понял. Я искал man-страницу Solaris ld и нашел как вариант -R, на страницах руководства говорится: список каталогов, разделенных двоеточиями, используемый для указания каталогов поиска библиотеки для компоновщика времени выполнения. Мне кажется, что это вариант, который вы имели в виду, установите для LDFLAGS значение -R /home/myuser/work/libiconv/lib и соберите libiconv и гем nokogiri с нуля. К сожалению ошибка осталась. ( Ошибка загрузки: ld.so.1: ruby: фатальный: libiconv.so.2: ошибка открытия: нет такого файла или каталога - /home/myuser/ruby/lib/ruby/gems/1.9.1/gems/nokogiri-1.4 .4/lib/nokogiri/nokogiri.so ) - person andreas; 07.06.2011
comment
Ну, вы, вероятно, компилируете с помощью gcc, поэтому вам, вероятно, потребуется установить LDFLAGS='-Wl,-R -Wl,/some/path' . GCC вызывает Solaris ld с параметрами, которые следуют за -Wl, . Я думаю, что в мое время (лет 14 назад) это было как -Xlinker -R -Xlinker /some/path - person Roman; 08.06.2011

Если вы собираетесь создать собственную песочницу, почему бы не использовать RVM для выполнения всей тяжелой работы. ? Целью его жизни является создание пользовательской песочницы в ~/.rvm, сборка и управление версиями Ruby, которые вы хотите запускать, и гемсетами, связанными с вашими проектами.

Если вы решите пойти по этому пути, который я настоятельно рекомендую, обязательно следуйте инструкциям по однопользовательской установке на связанной странице, чтобы добавить соответствующую строку в свой ~/.bash_profile или ~/.bashrc, если вы не используете * файл профиля, и следуйте рекомендациям, выдаваемым RVM при запуске rvm notes.

Я установил его на несколько компьютеров Centos, Ubuntu и Mac OS, где я занимаюсь разработкой, и думаю, что это здорово.

person the Tin Man    schedule 06.06.2011
comment
Я без проблем использую rvm на своем локальном компьютере (ubuntu), но на этом сервере Solaris он не устанавливается с помощью: Установка RVM в /home/bender/.rvm/awk: синтаксическая ошибка возле строки 1 awk: спасение возле строки 1 /home/myuser/.rvm/src/rvm/scripts/functions/installer: строка 364: cp: Нет такого файла или каталога Я искал эту проблему в Google и нашел суть (но, к сожалению, без решения здесь) здесь: gist.github.com/921374 и некоторые японские материалы здесь: d.hatena.ne.jp/murase_syuka/20101002/1286028764 , чего я не понимаю. :С - person andreas; 07.06.2011
comment
Я бы порекомендовал сбросить это с автора. Вы можете получить его адрес электронной почты, используя rvm -v. - person the Tin Man; 07.06.2011