我在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一样,但他们做得更多,这使得很难筛选出来。
非常感谢任何帮助!
答案 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)。