Ruby 2.2.0无法在Ubuntu 14.04.1 LTS上构建

时间:2015-01-10 21:11:12

标签: ruby ubuntu

我正在尝试在Ubuntu 14.04.1上构建Ruby 2.2.0,它总是失败。

以下是我正在安装的软件包。

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

这个问题与here所描述的非常相似,但是解决方案是安装一个我总是先安装的库。

libffi-dev是我总是首先安装的软件包之一。 dpkg -s libffi-dev显示已安装的版本Version: 3.1~rc1+r3.0.13-12但我仍然收到我在问题中发布的错误。

解决方案

看起来this是解决问题的方法。

2 个答案:

答案 0 :(得分:7)

您可以试试ruby-install工具吗?

它可以很好地安装ruby及其依赖项,库等。

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

  • 您可能需要考虑的其他Ruby安装程序包括rbenvruby-buildrvmBrightbox

  • 即使您的目标是从源代码安装Ruby,您也会发现尝试使用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,因为有些人报告arg以后不会工作。

例如,在编译器中添加-fPIC

CC=gcc -fPIC ...

例如,在配置中使用-fPIC

CFLAGS=-fPIC ./configure

答案 1 :(得分:1)

似乎你可以定义一个名为CFLAGS的变量,它将作为额外的参数传递给编译器(至少我从它那里收集了这些参数)。

因此,为了能够正确编译ruby 2.2.0,只需在CFLAGS=-fPIC调用之前运行./configure。示例:

CFLAGS=-fPIC ./configure

显然,如果你想将任何参数传递给configure,那么就这样做。从那里你的make命令应该没有任何打嗝。