运行 Ruby 在 C 编译和 link 问题
Running Ruby in C compile and link issues
我一整天都在尝试构建和 运行 一个简单的 Ruby C 程序内部。
这是一个反复出现的话题,其中 none 个与我的问题相同,也没有任何解决方案对我有帮助。我安装了 ruby-dev。
pkg-config 命令给出了这个:
$ pkg-config --cflags --libs ruby-2.7
-I/usr/include/x86_64-linux-gnu/ruby-2.7.0 -I/usr/include/ruby-2.7.0 -lruby-2.7 -lm
编译命令给出了这个:
$ gcc -I/usr/include/x86_64-linux-gnu/ruby-2.7.0 -I/usr/include/ruby-2.7.0 -I. -lruby-2.7 -o hello *.c
/usr/bin/ld: /tmp/ccdKXtnU.o: in function 'main':
hello.c:(.text+0x9): undefined reference to 'ruby_setup'
collect2: error: ld returned 1 exit status
我试过调换包含的顺序。我试过删除一个然后另一个包括。我已经尝试使用 Makefile 并通过 make 运行 将其编译。我试过将程序分成多个文件。我已经尝试将体系结构相关 config.h 文件符号链接到主头文件目录中。
唯一能想到的没试过的就是把需要链接的ruby对象库的名字放在命令行里,但是不知道名字,或该文件的位置。
这是节目的最新版本:
#include <stdio.h>
#include <ruby.h>
int main(void)
{
if (ruby_setup()){
puts("Hola!");
}
else{
printf("Hello World\n");
}
return(0);
}
pkg-config
将 cflags
和 libs
分开的原因之一是它们在 command-line 中的不同位置(有时是不同的命令)。
如果你要在一个命令中编译和link,它是这样的:
c99 -o hello $(pkg-config --cflags ruby-2.7) *.c $(pkg-config --libs ruby-2.7)
这种安排是有一定逻辑的。首先,我们告诉编译器在哪里寻找头文件(它必须在编译程序之前看到),然后告诉编译器在哪里找到要编译的程序,最后在哪里找到程序引用的库。
我一整天都在尝试构建和 运行 一个简单的 Ruby C 程序内部。
这是一个反复出现的话题,其中 none 个与我的问题相同,也没有任何解决方案对我有帮助。我安装了 ruby-dev。
pkg-config 命令给出了这个:
$ pkg-config --cflags --libs ruby-2.7
-I/usr/include/x86_64-linux-gnu/ruby-2.7.0 -I/usr/include/ruby-2.7.0 -lruby-2.7 -lm
编译命令给出了这个:
$ gcc -I/usr/include/x86_64-linux-gnu/ruby-2.7.0 -I/usr/include/ruby-2.7.0 -I. -lruby-2.7 -o hello *.c
/usr/bin/ld: /tmp/ccdKXtnU.o: in function 'main':
hello.c:(.text+0x9): undefined reference to 'ruby_setup'
collect2: error: ld returned 1 exit status
我试过调换包含的顺序。我试过删除一个然后另一个包括。我已经尝试使用 Makefile 并通过 make 运行 将其编译。我试过将程序分成多个文件。我已经尝试将体系结构相关 config.h 文件符号链接到主头文件目录中。
唯一能想到的没试过的就是把需要链接的ruby对象库的名字放在命令行里,但是不知道名字,或该文件的位置。
这是节目的最新版本:
#include <stdio.h>
#include <ruby.h>
int main(void)
{
if (ruby_setup()){
puts("Hola!");
}
else{
printf("Hello World\n");
}
return(0);
}
pkg-config
将 cflags
和 libs
分开的原因之一是它们在 command-line 中的不同位置(有时是不同的命令)。
如果你要在一个命令中编译和link,它是这样的:
c99 -o hello $(pkg-config --cflags ruby-2.7) *.c $(pkg-config --libs ruby-2.7)
这种安排是有一定逻辑的。首先,我们告诉编译器在哪里寻找头文件(它必须在编译程序之前看到),然后告诉编译器在哪里找到要编译的程序,最后在哪里找到程序引用的库。