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

Jas*_*oss 10 c dll gcc 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
Run Code Online (Sandbox Code Playgroud)

$ 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
Run Code Online (Sandbox Code Playgroud)

互联网(http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html)表明,盗版来自于

_declspec(dll{import,export})
Run Code Online (Sandbox Code Playgroud)

虽然附魔似乎有用

__declspec(dll{import,export})
Run Code Online (Sandbox Code Playgroud)

并且注释掉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;
}
Run Code Online (Sandbox Code Playgroud)

和包含内容的文件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;
}
Run Code Online (Sandbox Code Playgroud)

然后

gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe
Run Code Online (Sandbox Code Playgroud)

Enchant found但是给了

gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Jas*_*oss 7

修复我的最小例子的方法是添加--libsafter --cflags; gcc无法找到要链接的库.

我能够通过传递LDFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" CFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)"给configure脚本来解决我最初尝试编译的更复杂代码(gummi(http://dev.midnightcoding.org/projects/gummi))所遇到的问题.问题似乎是gcc的参数以错误的顺序传递,并且在尝试链接gtkspell时无法找到附魔.