2012-04-07 106 views
9

我試圖編譯一些依賴於gtkspell的東西,它在MinGW下依賴於附魔,其中 。我得到的錯誤,如 gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init' 我懷疑這是由於我試圖鏈接 againt一個{靜態,動態}庫時,我應該鏈接到另一個 ,或者因爲只有一個在IMP前加下劃線和 應該有兩個;我得到如何解決對_imp __ *的未定義引用?

$ objdump -t /d/opt/enchant-1.6.0/lib/libenchant.a | grep enchant_broker_init 
[ 85](sec 1)(fl 0x00)(ty 20)(scl 2) (nx 0) 0x00002ac0 _enchant_broker_init 

$ objdump -t /d/opt/enchant-1.6.0/lib/libenchant.dll.a | grep enchant_broker_init 
[ 6](sec 1)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 _enchant_broker_init 
[ 7](sec 3)(fl 0x00)(ty 0)(scl 2) (nx 0) 0x00000000 __imp__enchant_broker_init 

互聯網 (http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html) 表明小鬼忙玲來自

_declspec(dll{import,export}) 

雖然附魔似乎使用

__declspec(dll{import,export}) 

,並在enchant.h註釋掉相關線路使gtkspell.c 要求enchant_broker_init而非_imp__enchant_broker_init,但 不會改變,在libenchant顯示的符號。有沒有一種方法 使gcc不會破壞名稱,或者有沒有人有關於什麼 可能會出錯/如何解決它的想法?

這裏是再現我的系統上的問題,一個最小的例子:

如果我有內容

#include <stdio.h> 
#include <enchant.h> 

int main() 
{ 
#ifdef ENCHANT_MODULE_EXPORT 
    printf("\nEnchant found\n"); 
#else 
    printf("\nEnchant not found\n"); 
#endif 
    return 0; 
} 

文件enchanttest1.c與內容的文件enchanttest2.c

#include <stdio.h> 
#include <enchant.h> 

int main() 
{ 
    EnchantBroker *b = enchant_broker_init(); 
#ifdef ENCHANT_MODULE_EXPORT 
    printf("\nEnchant found\n"); 
#else 
    printf("\nEnchant not found\n"); 
#endif 
    return 0; 
} 

然後

gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe 

Enchant found

gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe 

C:\Users\JASONG~1\AppData\Local\Temp\ccyDLptc.o:testenchant.c:(.text+0xf): undefined reference to `_imp__enchant_broker_init' 
collect2: ld returned 1 exit status 
+0

這是一個愚蠢的建議,但你確保你調用C(而不是C++)編譯?你可能正在體驗微妙的名字嘲笑? – 2012-04-07 23:32:20

+0

'附魔。h'文件包裝所有內容 '#ifdef __cplusplus extern「C」{ #endif' 所以我不認爲這是問題所在。我也加了一個最小的例子,我很確定我正在調用C編譯。 – 2012-04-07 23:36:53

+0

作爲追隨者的一個提示,當我得到這個時,這是因爲「依賴庫」是用__declspec(dllimport)定義的,儘管它是一個靜態編譯。所以刪除,修復它,請參閱http://betterlogic.com/roger/2012/09/libflite-cross-compile-woe/ – rogerdpack 2012-09-05 17:58:47

回答

5

解決我的小例子,該方法是--cflags後添加--libs; gcc找不到要鏈接的庫。

我可以通過傳遞LDFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" CFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)"來解決我運行時遇到的問題,即我最初試圖編譯的更復雜的代碼(gummi(http://dev.midnightcoding.org/projects/gummi))到配置腳本;問題似乎是gcc的參數以錯誤的順序傳遞,並且在試圖鏈接gtkspell時找不到附魔。

相關問題