Ruby C(++) 扩展在 .so 文件中找不到 init 函数符号

Ruby C(++) Extension not finding init function symbol in .so file

所以现在我只是在 Ruby 中尝试 C/C++ 扩展,我在使用 rake-compile gem 时遇到了麻烦。现在我要做的就是定义一个模块,它不会加载 Init_* 函数,因为它表示符号未定义。但是当我检查 .so 文件时,它清楚地列在符号 table 中:

nm -gC RSFML.so                                 

0000000000201038 B __bss_start
                 w __cxa_finalize
0000000000201038 D _edata
0000000000201050 B _end
0000000000000744 T _fini
                 w __gmon_start__
00000000000005e0 T _init
                 w _ITM_deregisterTMCloneTable
                 w _ITM_registerTMCloneTable
                 w _Jv_RegisterClasses
                 U rb_define_module
0000000000201040 B RSFML
0000000000201048 B RSFML_Window
0000000000000725 T Init_RSFML()

这是我从 IRB 得到的错误:

irb -r ./lib/RSFML                      
/home/z/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require':LoadError: /home/z/Programming/ruby/RSFML-Gem/lib/RSFML.so: undefined symbol: Init_RSFML - /home/z/Programming/ruby/RSFML-Gem/lib/RSFML.so

一头雾水,关于C扩展的资料似乎不多。也许我缺少什么?我不知道。

Ruby 找不到 Init_RFSML 因为函数的名称实际上是 _Z10Init_RSFMLv(删除 -C 选项以禁用名称分解;实际名称可能也因使用的编译器而异。

因此您必须使用 C 链接声明 Init_* 函数,这样不会混淆名称。在 C++ 中,这是用 extern "C" 完成的,here.

解释得更透彻