Ruby 2.2.0 无法在 Ubuntu 14.04.1 LTS 上构建
Ruby 2.2.0 fails to build on Ubuntu 14.04.1 LTS
我正在尝试在 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
,但我仍然收到我在问题中发布的错误。
解决方案
看起来 是问题的解决方案。
你能试试 ruby-install
工具吗?
它在安装 ruby 及其依赖项、库等方面做得很好
https://github.com/postmodern/ruby-install
您可能要考虑的其他 Ruby 安装程序是 rbenv, ruby-build, rvm, and Brightbox.
即使您的目标是从源代码安装 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
更新...
I ran dpkg -s libffi-dev and I got Version: 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
您似乎可以定义一个名为 CFLAGS
的变量,该变量将作为额外参数传递给编译器(至少我是这样收集的)。
因此,为了能够正确编译 ruby 2.2.0,只需 运行 CFLAGS=-fPIC
在 ./configure
调用之前。示例:
CFLAGS=-fPIC
./configure
显然,如果您想将任何参数传递给 configure
,那么就这样做吧。从那里开始,您的 make
命令应该可以正常工作。
我正在尝试在 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
,但我仍然收到我在问题中发布的错误。
解决方案
看起来
你能试试 ruby-install
工具吗?
它在安装 ruby 及其依赖项、库等方面做得很好
https://github.com/postmodern/ruby-install
您可能要考虑的其他 Ruby 安装程序是 rbenv, ruby-build, rvm, and Brightbox.
即使您的目标是从源代码安装 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
更新...
I ran dpkg -s libffi-dev and I got Version: 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
您似乎可以定义一个名为 CFLAGS
的变量,该变量将作为额外参数传递给编译器(至少我是这样收集的)。
因此,为了能够正确编译 ruby 2.2.0,只需 运行 CFLAGS=-fPIC
在 ./configure
调用之前。示例:
CFLAGS=-fPIC
./configure
显然,如果您想将任何参数传递给 configure
,那么就这样做吧。从那里开始,您的 make
命令应该可以正常工作。