2012-01-12 34 views
6

我想写一个Ruby扩展,并且我一直在成功编译我的nmatrix.so共享对象文件。但是,突然间,它开始生产nmatrix.bundle,而没有任何.so文件。我是如何让gcc生成.bundle而不是.so的?

它没有给我任何链接错误,所以我无法想象为什么会这样。我也没有改变my Makefile or extconf.rb中的任何内容。我一直使用Ruby 1.9.3p0到rvm。

我试过在做我的日常工作并编译一些东西我知道应该在没有链接器错误(产生.so的东西)之前工作。不幸的是,这也产生了.bundle文件。

很明显,我已经做了一些事情 - 可能是无意中安装了某些东西 - 这已经改变了一些关键的GCC设置。这是完全可能的,因为我一整天的大部分时间都在尝试让LAPACK和ATLAS构建,并且在某些时候也安装了自制软件。

我发现有一种解决方法。我改变这两条线:

DLLIB = $(TARGET).bundle 
# ... 
LDSHARED = $(CC) -dynamic -bundle 

DLLIB = $(TARGET).so 
# ... 
LDSHARED = $(CC) -dynamic 

然后库编译和加载正确。然而,我并没有在extconf.rb(或其他地方)更改我自己生成的这个Makefile文件,而不是.so

问题是:我是如何造成这种情况的,我该如何恢复它?

+2

你可以加入你的'Makefile'吗? – sarnold 2012-01-12 00:24:14

+0

完成。 Makefile是使用'rvm ruby​​ extconf.rb'自动生成的,因此我也包含了'extconf.rb'。 – 2012-01-12 04:16:25

回答

2

看起来好像问题来自于LLVM gcc的使用,它与Xcode 4.2不兼容。

我已经安装了普通的gcc,所以我重新安装红宝石如下:

export CC=/usr/bin/gcc-4.2 
rvm install 1.9.3 

大部分方向似乎在说使用rvm install 1.9.3 --enable-shared代替,但额外的标志似乎是问题的根源。

无论如何,看来我现在可以加载.bundle文件。

+0

如果它解决了问题,请不要忘记将答案标记为“已接受”。 – sarnold 2012-02-06 03:29:19

3

C extensions RubyGems Guide有一个建设过程的概述。

extconf.rb文件中的关键线附近的两端:

require "mkmf" 
# ... 
create_makefile("nmatrix") 

此生成Makefile你。 Makefile使用存储在RbConfig::CONFIG[]阵列中的配置值构建;你最感兴趣的配置值是RbConfig::CONFIG['DLEXT']

$ ruby -e "require 'rbconfig'; puts RbConfig::CONFIG['DLEXT'];" 
so 

很容易地看到整个配置,寻找rbconfig.rb文件;该矿位于/usr/lib/ruby/1.8/x86_64-linux/rbconfig.rb,我会在这里包括前几行:

# This file was created by mkconfig.rb when ruby was built. Any 
# changes made to this file will be lost the next time ruby is built. 

module Config 
    RUBY_VERSION == "1.8.7" or 
    raise "ruby lib version (1.8.7) doesn't match executable version (#{RUBY_VERSION})" 

    TOPDIR = File.dirname(__FILE__).chomp!("/lib/ruby/1.8/x86_64-linux") 
    DESTDIR = '' unless defined? DESTDIR 
    CONFIG = {} 
    CONFIG["DESTDIR"] = DESTDIR 
    CONFIG["INSTALL"] = '/usr/bin/install -c' 
    CONFIG["EXEEXT"] = "" 
    CONFIG["prefix"] = (TOPDIR || DESTDIR + "/usr") 
    ... 
    CONFIG["DLEXT"] = "so" 
    CONFIG["LDSHARED"] = "$(CC) -shared" 
    CONFIG["CCDLFLAGS"] = " -fPIC" 
    ... 

所以,当红宝石的另一个版本是建立了一个建议,动态链接的扩展应该有你的rbconfig.rb文件的某些版本已建成一个不同的扩展。这可能是rvm(我仍然需要了解更多)的功能,或者这可能是Apple提供的Ruby与自编译的Ruby之间的区别。您可以在文件的注释标题中看到自己可以轻松地在rbconfig.rb中进行更改 - 但是在您下次重新构建或安装不同构建的Ruby时,它会被吹掉。 (顺便说一下,我认为扩展名是.dylib,但是自从我使用OS X以来已经有一段时间了。)

+0

你摇滚!下次我读MBA时,我会试试这个。非常感谢你。 – 2012-01-23 21:33:41

+0

好了,现在编译工作 - 但“rake编译”仍然失败,显然在复制操作: 'rake中止! 没有这样的文件或目录 - tmp/x86_64-darwin11.2.0/nmatrix/1.9.3/nmatrix.bundle' 我已经更改了'rbconfig.rb',所以我不确定在哪里查找。 – 2012-02-05 21:52:46

相关问题