2012-04-07 55 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时找不到附魔。

相关问题