【问题标题】:issues building ruby native extension构建 ruby​​ 原生扩展的问题
【发布时间】:2016-10-30 03:57:33
【问题描述】:

我在 c 中创建了一些我想从 ruby​​ 调用的代码。我以this article 为指导,但我无法让它在没有链接问题的情况下运行。

首先,我必须将源文件直接复制到我的ext/NAME/ 目录中。如果我将它们 git submodule 放入该目录,它们似乎不会被拾取,这意味着它们将位于诸如 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 库。我尝试查看其他项目以获取指导,例如 @ 987654322@,但他们做得更多,因此很难筛选。

非常感谢任何帮助!

【问题讨论】:

    标签: ruby ruby-native-extensions


    【解决方案1】:

    构建扩展

    通常,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 附带,但教程很少)或 ffi gem(文档更好,但需要 gem)。

    其他资源

    【讨论】:

    • 我会看看 FFI,如果这能解决我的问题,请告诉您!
    • 其实,我不确定这是否是我需要的。我想最终把它变成一个 gem,FFI 将简化接口部分,但也不会处理构建 c 库,除非它这样做并且我错过了?
    • 你没看错,FFI 帮助加载调用一个已经安装的 C 库(一个与 Ruby 无关的库)。为了比较,请考虑 Nokogiri gem:nokogiri 扩展不 build libxml2 - 你必须已经安装它。 nokogiri 扩展确实做了一些编译,但只针对特定于 Ruby 扩展的东西。
    • “您可以使用 dir_config 覆盖它们”是什么意思?
    猜你喜欢
    • 2016-09-25
    • 1970-01-01
    • 2011-05-27
    • 2010-09-07
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2021-08-31
    • 2023-03-29
    相关资源
    最近更新 更多