如何解决未定义参考_imp __ *?(How do I fix undefined referen

2019-07-28 20:59发布

我试图编译的东西,取决于gtkspell,这取决于附魔,MinGW的下。 我越来越喜欢错误gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'我怀疑这是无论是由于这样的事实,我试图链接againt一个{静态,动态}当我应该链接到的库另外一个,或者因为只有一个下划线小鬼之前应该有两个; 我得到

$ 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)表明小鬼的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

Answer 1:

修复我的小例子,该方法是添加--libs--cflags ; GCC找不到来链接库。

我能解决这个问题,我在用,我本来试图编译(橡皮糖(http://dev.midnightcoding.org/projects/gummi))通过将复杂的代码运行的问题LDFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" CFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)"来配置脚本; 这个问题似乎已经该参数在GCC顺序错误过去了,现在无法找到,当它试图链接gtkspell去换。



文章来源: How do I fix undefined reference to _imp__*?
标签: c gcc dll mingw