构建 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) .
其他资源
- RubyGems 有 gems with extensions
的官方指南
- Ruby本身带有一个guide to extensions
我已经用 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) .
其他资源
- RubyGems 有 gems with extensions 的官方指南
- Ruby本身带有一个guide to extensions