¿Cómo arreglo una referencia no definida a _imp __ *?

Estoy tratando de compilar algo que depende de gtkspell, que depende de encantar, bajo MinGW. Estoy recibiendo errores comogtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init' Sospecho que esto se debe al hecho de que estoy tratando de vincular nuevamente una biblioteca {static, dynamic} cuando debería vincularme con la otra, o porque solo hay un subrayado antes del imp y debe haber dos; yo obtengo

<code>$ 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
</code>

y

<code>$ 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
</code>

Internet (http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html) sugiere que la manipulación del implante proviene de

<code>_declspec(dll{import,export})
</code>

aunque el encantamiento parece usar

<code>__declspec(dll{import,export})
</code>

, y comentando las líneas relevantes en enchant.h hace que gtkspell.c soliciteenchant_broker_init más bien que_imp__enchant_broker_init, pero no cambia los símbolos que aparecen en libenchant. ¿Hay alguna manera de hacer que gcc no destruya los nombres, o alguien tiene ideas sobre lo que podría salir mal o cómo solucionarlo?

Aquí hay un ejemplo mínimo que reproduce el problema en mi sistema:

Si tengo un archivo enchanttest1.c con contenidos

<code>#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;
}
</code>

y un archivo enchanttest2.c con contenidos.

<code>#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;
}
</code>

entonces

<code>gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe
</code>

daEnchant found pero

<code>gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe
</code>

da

<code>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
</code>

Respuestas a la pregunta(1)

Su respuesta a la pregunta