0

我使用 vanilla ./configure 命令在 Fedora 16 上构建了 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 下各个目录的 -I 路径,因此构建失败。不过我不确定,因为 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 上一直很麻烦。

4

1 回答 1

-1

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

于 2012-06-26T22:49:14.070 回答