2011-04-03 144 views
0

我不斷收到這個相當模糊的鏈接錯誤,每當我試圖鏈接my Ruby extensionRuby擴展鏈接錯誤

/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 

這些也出現了,當我第一次遇到這個問題。我不完全確定他們的意思。

回答

1

您更新的錯誤告訴您,您在某處引用了init_window_class_underinit_display_mode_class_under,但它們未被定義。這些函數實際上在Window.c中定義,但它們在源文件和頭文件中均被聲明爲static。從Window.c中的函數中刪除static鏈接修飾符,並在Window.h中聲明它們爲extern。看起來你在Display.cx11子目錄中的所有內容都犯了同樣的錯誤。

任何聲明爲static的文件都具有文件範圍,並且在文件本身之外不可見。

你原來的錯誤:發生

undefined symbol `init_window_class_under' 

,因爲所有的Window.c(和init_window_class_under具體地)功能staticstatic功能不會產生任何符號鏈接找到。只有具有外部鏈接的實體纔會在目標文件中產生符號。

+0

優秀的解釋。謝謝! – 2011-04-04 01:43:25

1

正如錯誤信息所暗示的,必須使用-fPIC構建目標文件才能鏈接到x86-64上的共享庫(這在其他平臺上也是一個好主意)。

-fPIC添加到您的CFLAGS並重建所有對象。

+0

在由'extconf.rb'生成的'Makefile'中有'CFLAGS = -fPIC $(cflags)-fPIC'這行,但它不會與它一起編譯。我也有一個古老的症狀,檢查我更新的問題。 – 2011-04-04 00:23:31