You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译调用libruby.so的C程序时链接器找不到Ruby符号的问题

问题解决:Ruby C扩展链接ruby_init/ruby_cleanup时出现未定义引用错误

问题场景

  • 按Ruby官方快速入门指南编译完成Ruby后,编写了一个调用ruby_init和ruby_cleanup的简单C程序
  • 执行指定gcc编译命令时,触发链接错误:undefined reference to 'ruby_init'、undefined reference to 'ruby_cleanup'
  • 已完成的前置排查:
    • 用objdump -T libruby.so | grep ruby_init确认动态库libruby.so中确实存在目标符号
    • 改用dlopen动态加载libruby.so并调用符号的程序可正常运行
    • 尝试过重新编译静态库、清理编译缓存后重新编译Ruby,均未解决问题

解决方案

调整gcc命令中链接库的顺序即可解决。

GCC链接器遵循「从左到右处理文件」的规则:当处理到一个库文件时,只会尝试用该库解析当前已出现的未定义符号,不会回溯处理之前的目标文件。因此,依赖库需要放在源文件/目标文件的后面。

举个例子:

  • 错误的编译命令(库在源文件前):
gcc -lruby my_ruby_program.c -o my_ruby_program
  • 正确的编译命令(库在源文件后):
gcc my_ruby_program.c -lruby -o my_ruby_program

调整顺序后,链接器会先处理你的C代码,识别出ruby_init、ruby_cleanup这些未定义符号,再从后续的libruby.so中查找并解析它们,最终完成链接。

内容的提问来源于stack exchange,提问作者Some nerd who does not have a

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 11:45:58