Ruby扩展链接错误

每当我尝试链接我的Ruby扩展时,我都会收到这个相当模糊的链接错误:
/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
当我第一次遇到问题时,这些也出现了。我不确定他们的意思。     
已邀请:
您更新的错误告诉您,您正在某处引用
init_window_class_under
init_display_mode_class_under
,但它们未定义。这些函数实际上是在
Window.c
中定义的,但它们在源文件和头文件中都被声明为
static
。从
Window.c
中的函数中删除
static
连接修饰符,并在
Window.h
中将它们声明为
extern
。看起来你在
Display.c
x11
子目录中的所有内容都犯了同样的错误。 声明为
static
的任何内容都有文件范围,在文件本身之外是不可见的。 你原来的错误:
undefined symbol `init_window_class_under'
因为
Window.c
(特别是
init_window_class_under
)中的所有函数都是
static
而且
static
函数不会导致链接器找到任何符号。只有具有外部链接的实体才会在目标文件中生成符号。     
正如错误消息所暗示的那样,必须使用
-fPIC
构建目标文件才能链接到x86-64上的共享库(在其他平台上也是个好主意)。 将
-fPIC
添加到
CFLAGS
并重建所有对象。     

要回复问题请先登录注册