Wie behebe ich undefinierte Verweise auf _imp __ *?

Ich versuche unter MinGW etwas zu kompilieren, das von gtkspell abhängt, was von enchant abhängt. Ich bekomme Fehler wiegtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init' Ich vermute, dass dies entweder daran liegt, dass ich versuche, eine {statische, dynamische} Bibliothek erneut zu verknüpfen, wenn ich eine Verknüpfung mit der anderen erstellen soll, oder daran, dass vor dem Kobold nur ein Unterstrich und zwei vorhanden sind. Ich bekomme

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

und

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

Das Internet (http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html) deutet darauf hin, dass die Imp Mangling von stammt

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

obwohl verzaubern zu verwenden scheint

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

Wenn Sie die relevanten Zeilen in enchant.h auskommentieren, wird gtkspell.c angefordertenchant_broker_init eher, als_imp__enchant_broker_init, ändert aber nichts an den Symbolen, die in libenchant angezeigt werden. Gibt es eine Möglichkeit, gcc dazu zu bringen, die Namen nicht zu verfälschen, oder hat jemand eine Vorstellung davon, was möglicherweise schief geht / wie man es behebt?

Hier ist ein minimales Beispiel, das das Problem auf meinem System reproduziert:

Wenn ich eine Datei enchanttest1.c mit Inhalt habe

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

und eine Datei enchanttest2.c mit Inhalt

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

dann

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

gibtEnchant found aber

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

gibt

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage