【问题标题】:Problems with built-from-source Ruby 1.9.2 on Linux, when using mkmf.rb使用 mkmf.rb 时在 Linux 上构建源代码 Ruby 1.9.2 的问题
【发布时间】:2012-06-26 07:46:51
【问题描述】:

我在 Fedora 16 上使用 vanilla ./configure 命令构建了 Ruby 1.9.2-p320, 安装在 /usr/local

包含文件位于 /usr/local/include/ruby-1.9.1

这个程序说“不”:

require 'mkmf'
puts have_func('rb_thread_blocking_region') ? "yes" : "no"

我认为是因为命令行来构建conftest.c 看看是否 rb_thread_blocking_region 存在不包含指向 /usr/local/include/ruby-1.9.1 下的各种目录,所以 构建失败。不过我不确定,因为 mkmf 使用自定义记录器, 并且每当我尝试将 $stderr.puts 语句添加到某些 方法,我要么看不到输出,要么收到该错误消息 告诉我我需要安装开发工具。我在Linux上 有很多开发工具,加上 Ruby 源代码,但如果有人可以 告诉我如何在 try_func 方法中转储 headers 变量 可能会有帮助。

奇怪的是我在构建其他二进制 gem 时没有遇到任何问题 到目前为止,包括 RMagick,但我被困在 mysql2 上,因为它 认为 rb_thread_blocking_region 不存在,所以生成 代码错误。

再深入一点,我可以用适当的编译这个程序 -I 选项,所以 rb_thread_blocking_region 肯定存在。

$ cat conftest.c 
#include "ruby.h"
int main(int argc, char **argv) { return 1; }

int t() {
  void ((*volatile p)());
  p = (void ((*)())) rb_thread_blocking_region;
  return 0;
}

啊,问题出在这里,来自 mkmf.log:

“gcc -o conftest -I/usr/local/include/ruby-1.9.1/i686-linux -I/usr/local/include/ruby-1.9.1/ruby/backward -I/usr/local/include/ruby-1.9.1 -I. -I/usr/local/include/ruby-1.9.1/ -D_FILE_OFFSET_BITS=64 -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-括号 -Wpointer-arith -Wwrite-strings -Wno-missing-field-initializers -Wno-long-long conftest.c -L。 -L/usr/local/lib -Wl,-R/usr/local/lib -L。 -rdynamic -Wl,-export-dynamic -Wl,-R -Wl,/usr/local/lib -L/usr/local/lib -lruby-static -lpthread -lrt -ldl -lcrypt -lm -lc" /usr/lib/gcc/i686-redhat-linux/4.6.3/../../../libcrypt.a(md5-crypt.o): 在函数“__md5_crypt_r”中: (.text+0x96): 未定义的对“NSSLOW_Init”的引用 /usr/lib/gcc/i686-redhat-linux/4.6.3/../../../libcrypt.a(md5-crypt.o): 在函数“__md5_crypt_r”中:

我早该想到的——crypt 和 openssl 库一直是 Fedora 上的麻烦。

【问题讨论】:

  • 我认为您应该能够为安装过程提供可选的包含目录,例如gem install mysql2 -- --with-opt-include=/usr/local/include/ruby-1.9.1
  • 谢谢,但这没有用。我能够构建/安装本地 gem(0.2.11),但是 gem 坏了。 mysql2.rb 需要'mysql2/mysql2.rb',它不存在。我删除了 gem,运行建议的命令导致了同样的问题:“检查 rb_thread_blocking_region()...no”
  • 您说您可以使用适当的选项构建 conftest。您正在使用哪些合适的选项?还有什么地方没有 mkmf.log 吗?
  • 我可以用 -I 指向两个 ruby​​ 包含目录来构建 conftest,没什么大不了的。我试图通过回显用于构建 conftest 的命令来理解 mkmf 失败的原因。我该如何使用记录器?
  • 安装 gem 时没有收到任何错误吗?在大多数情况下,任何错误情况都会留下一个名为 mkmf.log 的日志文件。这就是所有输出的去向。阅读您的错误消息,在所有情况下我都看到它甚至告诉您应该阅读mkmf.log,它会告诉您文件在哪里。

标签: ruby mkmf


【解决方案1】:

通过查看 mkmf.log 找到答案。仍然无法正常工作,但这是另一个问题。

【讨论】:

    猜你喜欢
    • 2019-06-26
    • 1970-01-01
    • 2019-11-10
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多