我正在尝试编译依赖gtkspell的内容
取决于附魔,在MinGW下。我收到类似的错误
gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'我怀疑这是由于我要链接的事实
当我应该链接到{static,dynamic}库时
另外一个,或者因为在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)
表明imp捣乱来自
_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

最佳答案

解决我的最小示例的方法是在--libs之后添加--cflags; 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时找不到附魔。

关于c - 如何修复对_imp __ *的 undefined reference ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10059200/

10-09 08:42