Как исправить неопределенную ссылку на _imp__*?

Я пытаюсь скомпилировать что-то, что зависит от gtkspell, который зависит от очарования, под MinGW. Я получаю такие ошибки, как gtkspell/gtkspell.c:757: неопределённая ссылка на «_imp__enchant_broker_init» Я подозреваю, что это либо из-за того, что я пытаюсь связать Сноваt библиотека {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) предполагает, что искажение беса происходит от

_declspec(dll{import,export})

, хотя enchant, по-видимому, использует

__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

дает Очарование найдено, но

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
10
задан Jason Gross 7 April 2012 в 23:35
поделиться