0

我在 c 中创建了一些我想从 ruby​​ 调用的代码。我已将这篇文章用作指南,但在没有链接问题的情况下运行它时遇到了问题。

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

接下来,似乎我必须运行我的 c 项目 makefile,否则我会遇到段错误。如果我运行我的 makefile,目标文件.oext/NAME/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,但他们正在做更多,这使得很难筛选。

任何帮助深表感谢!

4

1 回答 1

0

构建扩展

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

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

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

加载库

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

其他资源

于 2016-10-30T08:42:48.010 回答