Ruby 2.2.0 не может работать на Ubuntu 14.04.1 LTS

Я пытаюсь создать Ruby 2.2.0 на Ubuntu 14.04.1, и он всегда терпит неудачу.

Вот пакеты, которые я устанавливаю заранее.

DEPENDENCIES = %w{
  build-essential bison openssl libreadline6 libreadline6-dev git-core zlib1g
  zlib1g-dev libssl-dev libyaml-dev libxml2-dev libgdbm3 libgdbm-dev autoconf
  libxslt-dev libc6-dev ncurses-dev automake pkg-config subversion libtool
  libffi-dev libncurses5-dev
}

Вот ошибка, которую я получаю.

linking shared-object fiddle.so
make[2]: Leaving directory `/usr/local/src/ruby-2.2.0/ext/fiddle'
make[1]: Leaving directory `/usr/local/src/ruby-2.2.0'
STDERR: Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
/usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
./libffi-3.2.1/.libs/libffi.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [../../.ext/x86_64-linux/fiddle.so] Error 1
make[1]: *** [ext/fiddle/all] Error 2
make: *** [build-ext] Error 2
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.2-19ubuntu1' --with-    bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
/usr/bin/ld: ./libffi-3.2.1/.libs/libffi.a(raw_api.o): relocation R_X86_64_32S against `.rodata' can not be used when making a shared object; recompile with -fPIC
./libffi-3.2.1/.libs/libffi.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
make[2]: *** [../../.ext/x86_64-linux/fiddle.so] Error 1
make[1]: *** [ext/fiddle/all] Error 2
make: *** [build-ext] Error 2

Эта проблема очень напоминала описанную здесь, но решение, данное там, заключается в установке библиотеки, которую я всегда устанавливаю в первую очередь.

libffi-dev - это один из пакетов, которые я всегда устанавливаю в первую очередь. dpkg -s libffi-dev показывается версия Version: 3.1~rc1+r3.0.13-12, но я все еще получаю сообщение об ошибке, которое я разместил в вопросе.

Решение

Похоже, что это является решением проблемы.

Ответ 1

Кажется, вы можете определить переменную с именем CFLAGS, которая будет передана в качестве дополнительных параметров компилятору (по крайней мере, то, что я собрал на нем).

Итак, чтобы иметь возможность правильно скомпилировать ruby ​​2.2.0, просто запустите CFLAGS=-fPIC перед вызовом ./configure. Пример:

CFLAGS=-fPIC ./configure

Очевидно, что если вы хотите передать какие-либо параметры в configure, сделайте это. Оттуда команда make должна работать без каких-либо икота.

Ответ 2

Можете ли вы попробовать инструмент ruby-install?

Он отлично справляется с установкой рубина и его зависимостей, библиотек и т.д.

https://github.com/postmodern/ruby-install

  • Другие установщики Ruby, которые вы, возможно, захотите рассмотреть, rbenv, ruby-build, rvm и Brightbox.

  • Даже если ваша цель - установить Ruby из исходного кода, может оказаться полезным попробовать рубинский установщик, выяснить, какие шаги могут быть у вас установлены и как решить вашу ошибку.

Вы можете проверить, правильно ли установлен ваш libffi-dev?

dpkg -s libffi-dev

У меня есть Ubuntu 14 и Ruby 2.2.0, и мой libffi-dev показывает:

Version: 3.1~rc1+r3.0.13-12

В то время как ваше сообщение об ошибке показывает, что ваша установка пытается использовать более новую версию:

libffi-3.2.1

Обновление...

Я запустил dpkg -s libffi-dev и получил версию: 3.1 ~ rc1 + r3.0.13-12.

Хорошо:

  • Ваша система имеет правильную libffi, ту же версию в официальных пакетах.

  • В то время как ваша установка Ruby пытается использовать другую версию.

  • Это несоответствие показывает, что ваша установка Ruby не находит вашу систему libffi.

Когда я загружаю источник Ruby 2.2.0, я вижу, что каталог fiddle имеет другую libffi, чем моя система:

➜  ruby-2.2.0  find . | grep libffi
./ext/fiddle/libffi-3.2.1

В каталоге libffi есть свои README, configure и Makefile.

Если вы видите то же самое в своей системе, вы можете попробовать сделать это самостоятельно и, возможно, установить его тоже - хотя я не знаю, перезаписывает ли это вашу систему libffi, поэтому, возможно, будьте осторожны или установите в обычную каталог:

./ext/fiddle/libffi-3.2.1
./configure
make
make install

Если вы получите ту же существенную ошибку и предложение скомпилировать с помощью -fPIC, тогда вы также можете попробовать это. Направьте -fPIC как первый аргумент, потому что некоторые люди сообщают, что arg не работает позже.

Например, чтобы добавить -fPIC в ваш компилятор:

CC=gcc -fPIC ...

Например, чтобы использовать -fPIC в вашей конфигурации:

CFLAGS=-fPIC ./configure