运行 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-configcflagslibs 分开的原因之一是它们在 command-line 中的不同位置(有时是不同的命令)。

如果你要在一个命令中编译和link,它是这样的:

c99 -o hello $(pkg-config --cflags ruby-2.7) *.c $(pkg-config --libs ruby-2.7)

这种安排是有一定逻辑的。首先,我们告诉编译器在哪里寻找头文件(它必须在编译程序之前看到),然后告诉编译器在哪里找到要编译的程序,最后在哪里找到程序引用的库。