构建ruby原生扩展

时间:2016-10-30 03:57:33

标签: ruby ruby-native-extensions

我在c中创建了一些我想从ruby调用的代码。我已经使用this article作为指导,但是我遇到问题而没有链接问题就可以运行。

首先,我必须直接将源文件复制到我的ext/NAME/目录中。如果我把它们子模块放到那个目录中,它们似乎就没有了,这意味着它们会在ext/NAME/CLIB_GIT_SUBMODULE_FILES/之类的子目录下。

接下来,似乎我必须运行我的c项目makefile,否则我会遇到段错误。如果我运行我的makefile,则在.o目录中创建目标文件(ext/NAME),现在当我尝试运行rake(在/test/下运行我的测试用例时)我看到链接问题像:

linking shared-object NAME/NAME.so
gcc: error: SOMEFILE_ONE.o: No such file or directory
gcc: error: SOMEFILE_TWO.o: No such file or directory
gcc: error: SOMEFILE_THREE.o: No such file or directory
make: *** [ruby_fast_numerizer.so] Error 1
rake aborted!

请注意,当我在ext/NAME/下运行makefile时,会创建SOMEFILE_ONE.o等。

我不确定此时发生了什么:(指南似乎都是在ext/NAME目录中编写新的c代码,而不是包装现有的c库。我试着查看其他项目以获得指导像nokogiri一样,但他们做得更多,这使得很难筛选出来。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

建立扩展

通常,ext/NAME/extconf.rb使用mkmf(MakeMakefile)编写一个新的Makefile,其中包含从提供的源构建Ruby扩展的所有配置。 MakeMakefile具有查找源代码,标题和所有其他部分的默认值,但您可以覆盖它们(例如,使用dir_config)。

生成的Makefile将包含编译源文件的指令,并将所有内容与相关的Ruby库链接起来,以生成本机Ruby扩展。

如果你有一个与Ruby无关的现有C库,它可能有自己的Makefile和构建过程。不要将Ruby生成的Makefile与您自己的混淆!

加载库

对于包装现有的C库,我根本不会构建本机扩展,而是使用FFI加载库。两个主要的FFI选项是Fiddle(附带Ruby,但教程很少)或ffi gem(更好地记录,但需要一个gem)。

其他资源