我试图编译的东西,取决于gtkspell,这取决于附魔,MinGW的下。 我越来越喜欢错误gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'
我怀疑这是无论是由于这样的事实,我试图链接againt一个{静态,动态}当我应该链接到的库另外一个,或者因为只有一个下划线小鬼之前应该有两个; 我得到
$ 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)表明小鬼的mangling来自
_declspec(dll{import,export})
虽然附魔似乎用
__declspec(dll{import,export})
,并在enchant.h注释掉相关线路使gtkspell.c要求enchant_broker_init
而非_imp__enchant_broker_init
,但并没有改变,在libenchant显示的符号。 有没有一种方法,使GCC没有裂伤的名称,或者有没有人有想法可能是想错了/如何解决呢?
下面是我的再现系统上的问题,一个最小的例子:
如果我有内容的文件enchanttest1.c
#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;
}
并与内容的文件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