每当我尝试链接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
当我第一次遇到问题时,这些也出现了。我不太清楚他们的意思。
答案 0 :(得分:1)
正如错误消息所暗示的那样,必须使用-fPIC
构建目标文件,以便链接到x86-64上的共享库中(在其他平台上也是个好主意)。
将-fPIC
添加到CFLAGS
并重建所有对象。
答案 1 :(得分:1)
您更新的错误告诉您,您正在某处引用init_window_class_under
和init_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
函数不会导致链接器找到任何符号。只有具有外部链接的实体才会在目标文件中生成符号。