我正在尝试编译依赖于gtkspell的东西
在MinGW下取决于附魔。我得到的错误就像
gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'
我怀疑这是因为我正试图链接
当我应该链接到一个{静态,动态}库时
另一个,或因为在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不破坏名称,或者是否有人对什么有所了解
可能会出错/如何解决?
这是一个在我的系统上重现问题的最小例子:
如果我的文件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
答案 0 :(得分:7)
修复我的最小示例的方法是在--libs
之后添加--cflags
; gcc无法找到要链接的库。
我能够通过传递{{{}来解决我最初尝试编译的更复杂代码(gummi(http://dev.midnightcoding.org/projects/gummi))的问题。 1}}到configure脚本;问题似乎是gcc的参数以错误的顺序传递,当它试图链接gtkspell时它无法找到附魔。