构建 ruby 本机扩展的问题

issues building ruby native extension

我已经用 c 语言创建了一些代码,我想从 ruby 调用这些代码。我使用 this article 作为指南,但我在没有链接问题的情况下将其设置为 运行 时遇到问题。

首先,我必须直接将源文件复制到我的 ext/NAME/ 目录中。如果我 git 将它们子模块化到该目录中,它们似乎不会被拾取,这意味着它们将位于某些子目录下,例如 ext/NAME/CLIB_GIT_SUBMODULE_FILES/.

接下来,看来我必须 运行 我的 c 项目 makefile,否则我 运行 会出现段错误。如果我 运行 我的 makefile,目标文件 (.o) 是在 ext/NAME 目录中创建的,现在当我尝试 运行 rake(运行s我在 /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 这样的指导,但他们正在做更多的事情,这使得筛选变得困难。

非常感谢任何帮助!

构建扩展

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

生成的 Makefile 将包含编译源文件和 link 一切与相关 Ruby 库的指令,以生成本机 Ruby 扩展。

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

正在加载库

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

其他资源