13

我正在尝试在 MinGW 下编译依赖于 gtkspell 的东西,这依赖于附魔。我收到错误, 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 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
4

1 回答 1

6

修复我的最小示例的方法是在--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 时找不到附魔。

于 2012-04-08T00:07:46.193 回答