嵌入 Ruby 的 Ubuntu C 程序:致命错误:找不到 ruby/config.h

问题描述 投票:0回答:1

我正在尝试编译尽可能简单的C程序:

gcc -Wall -O0 -std=c99 -pedantic -pedantic-errors `ruby -rrbconfig -e 'puts RbConfig::CONFIG["LIBRUBYARG"]'` -I`ruby -rrbconfig -e 'puts RbConfig::CONFIG["rubyhdrdir"]'` -I. -o test test.c

In file included from /usr/include/ruby-3.2.0/ruby/ruby.h:15,
                 from /usr/include/ruby-3.2.0/ruby.h:38,
/usr/include/ruby-3.2.0/ruby/internal/config.h:22:10: fatal error:     ruby/config.h: Nie ma takiego pliku ani katalogu
 22 | #include "ruby/config.h"
    |          ^~~~~~~~~~~~~~~
    compilation terminated.
#include "ruby.h"

int main(int argc, char* argv[])
{
  ruby_init();
  return ruby_cleanup(0);
}

在 Fedora 上编译类似的代码。

如何为 cc 编译器输入好的选项。

c ruby ubuntu embedded include
1个回答
0
投票

要使用 GCC 在 C 程序中编译 Ruby 库,我们需要将三个附加标志传递给 gcc。

  1. rubyhdrdir
    -I
    一起使用来添加包含路径
  2. rubyarchhdrdir
    -I
    一起使用来添加包含路径
  3. LIBRUBYARG
    链接我们的动态库。

在我的 Debian 12 机器上为了拥有完整的开发工具链,我安装了以下软件包。

apt install ruby ruby-dev

之后找到上面的三个标志,运行简单的 ruby 脚本。

查找.rb

require 'rbconfig'
require 'shellwords'

rblib = RbConfig::CONFIG['libdir']

# location of ruby.h
puts "-I#{Shellwords.escape RbConfig::CONFIG['rubyhdrdir']}"

# location of ruby/config.h
puts "-I#{Shellwords.escape RbConfig::CONFIG['rubyarchhdrdir']}"

# location of libruby
puts "#{RbConfig::CONFIG["LIBRUBYARG"]}"

对我来说这是输出

-I/usr/include/ruby-3.1.0
-I/usr/include/x86_64-linux-gnu/ruby-3.1.0
-lruby-3.1

到目前为止的代码和编译命令是:

hello_ruby.c

#include "ruby.h"

int main(int argc, char *argv[])
{
    ruby_init();

    return ruby_cleanup(0);
}

考虑在其他编译选项之前表达你的源代码,我不知道为什么要购买,如果你把它放在最后它不起作用。

gcc -o hello_ruby hello_ruby.c -Wall -I/usr/include/ruby-3.1.0 -I/usr/include/x86_64-linux-gnu/ruby-3.1.0 -lruby-3.1

或更通用的方法是运行我们的 find.rb 脚本来获取编译器标志。

$ gcc -o hello_ruby hello_ruby.c -Wall $(ruby find.rb)

另一种查找 ruby 库的方法是运行

$ apt install pkg-config
$ pkg-config --libs ruby
-lruby-3.1 -lm 

我的回答完全基于以下链接和答案

© www.soinside.com 2019 - 2024. All rights reserved.