Ruby扩展链接错误

时间:2011-04-03 23:03:11

标签: c ruby linker ruby-c-extension

每当我尝试链接my Ruby extension时,我都会收到相当模糊的链接错误:

/usr/bin/ld: Mg.o: relocation R_X86_64_PC32 against undefined symbol `init_window_class_under' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value

我找不到任何相关内容。我试验了一段时间,当我删除头文件时链接很好,所以我继续没有它们(是的,非常糟糕的主意)。

原来我需要它们。那么,究竟是什么错误,我该如何消除它?

更新:清除所有内容后,我开始收到这些警告:

warning: ‘init_window_class_under’ used but never defined
warning: ‘init_display_mode_class_under’ used but never defined

当我第一次遇到问题时,这些也出现了。我不太清楚他们的意思。

2 个答案:

答案 0 :(得分:1)

正如错误消息所暗示的那样,必须使用-fPIC构建目标文件,以便链接到x86-64上的共享库中(在其他平台上也是个好主意)。

-fPIC添加到CFLAGS并重建所有对象。

答案 1 :(得分:1)

您更新的错误告诉您,您正在某处引用init_window_class_underinit_display_mode_class_under但未定义它们。这些函数实际上是在Window.c中定义的,但它们在源文件和头文件中都被声明为static。从static中的函数中删除Window.c链接修饰符,并在extern中将其声明为Window.h。看起来你在Display.c以及x11子目录中的所有内容中犯了同样的错误。

声明为static的任何内容都有文件范围,在文件本身之外不可见。

您的原始错误:

undefined symbol `init_window_class_under'
发生

是因为Window.c(特别是init_window_class_under)中的所有函数都是static,而static函数不会导致链接器找到任何符号。只有具有外部链接的实体才会在目标文件中生成符号。