我正在尝试编译尽可能简单的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 编译器输入好的选项。
要使用 GCC 在 C 程序中编译 Ruby 库,我们需要将三个附加标志传递给 gcc。
rubyhdrdir
与 -I
一起使用来添加包含路径rubyarchhdrdir
与 -I
一起使用来添加包含路径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
我的回答完全基于以下链接和答案