如何修复_imp __ *的未定义引用?

时间:2012-04-07 23:28:15

标签: c gcc dll mingw

我正在尝试编译依赖于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

1 个答案:

答案 0 :(得分:7)

修复我的最小示例的方法是在--libs之后添加--cflags; gcc无法找到要链接的库。

我能够通过传递{{{}来解决我最初尝试编译的更复杂代码(gummi(http://dev.midnightcoding.org/projects/gummi))的问题。 1}}到configure脚本;问题似乎是gcc的参数以错误的顺序传递,当它试图链接gtkspell时它无法找到附魔。