编译调用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
相关产品推荐
相关产品推荐

