gpt4 book ai didi

ruby native 扩展 : undefined symbol

转载 作者:太空宇宙 更新时间:2023-11-03 18:08:06 24 4
gpt4 key购买 nike

我正在尝试创建一个 ruby​​ 原生扩展,但是当我运行 rake 时,它使用 ext/example_project/extconf.rb 来构建我的项目并运行我的测试在 test/ 下,运行测试时出现以下错误:

./home/jbuesking/.rbenv/versions/2.3.0/bin/ruby: symbol lookup error: 
/home/jbuesking/repositories/example_project/lib/example_project/example_project.so: undefined symbol: some_function

我很确定我的文件没有正确链接,我需要以某种方式更改我的 extconf.rb 和/或 Rakefile,但是我'我不确定如何。

我创建了一个简单的存储库来演示 over on GitHub 问题.如果您克隆它并从项目根目录运行 rake,它将失败并出现相同的错误。

一些附加信息:

  • 我使用 ruby​​ gem hoe 通过 sow example_project 创建项目
  • 失败的函数正在尝试调用子目录 ext/example_project/c_example_project 中定义的函数。我的实际项目使用 ext/example_project 目录中的 git 子模块,该目录又将子模块设置为子目录。子模块是一个扁平结构的c项目(根目录下的所有文件)。 注意:该措辞可能令人困惑,但关键是在 ext/example_project/c_example_project 中定义了一个嵌套的 c 项目,其中包含我要调用的方法。

如果需要任何说明,请告诉我,我会尽力提供。

最佳答案

所以,这里有一些有趣的问题。默认情况下,mkmf 实际上不支持为构建源指定多个目录。

这里有一个变通方法(Takehiro Kubo 关于设置 objs 的评论):

https://www.ruby-forum.com/topic/4224640

基本上,您在 extconf.rb 文件中自己构造 $objs 全局

使用您的 github 代码,这是我添加到 extconf.rb 并开始工作的内容

extconf.rb

globs = [".", "c_example_project"].map do |directory|
File.join(File.dirname(__FILE__), directory)
end.join(",")

$objs = Dir.glob("{#{globs}}/*.c").map do |file|
File.join(File.dirname(file), "#{File.basename(file, ".c")}.o")
end

请注意,我实际上正在为每个 c 源构建一个绝对路径,出于某种原因,如果我们只是使用 {.,c_example_project}/*.c 的话,rake-compiler 会崩溃,大概是因为它从另一个目录运行 extconf.rb 文件。

此外,您的 tests/c 扩展中有一些错误。在 example_project.c 中进行以下更改修复了测试失败:

 static VALUE example_project_c_code_function()
{
- return some_function();
+ VALUE _string = rb_str_new2(some_function());
+ int _enc = rb_enc_find_index("UTF-8");
+ rb_enc_associate_index(_string, _enc);
+ return _string;
}

解释

基本上,即使您正在检查 extconf.rb 中的 c_example_project.h header ,您实际上并没有生成定义了 some_function 的目标文件。因此,当链接 ruby​​ 加载的最终动态库时,some_function 没有定义,您会收到错误消息。

关于ruby native 扩展 : undefined symbol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40336693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com