Como faço para corrigir referência indefinida para _imp __ *?
Estou tentando compilar algo que depende do gtkspell, que depende do enchant, no MinGW. Estou recebendo erros comogtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'
Eu suspeito que isso seja devido ao fato de que eu estou tentando vincular novamente uma biblioteca {static, dynamic} quando eu deveria estar ligando contra a outra, ou porque há apenas um sublinhado antes do imp e deve haver dois; eu recebo
<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>
e
<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>
A internet (http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html) sugere que o desmanchamento vem de
<code>_declspec(dll{import,export}) </code>
embora encantar parece usar
<code>__declspec(dll{import,export}) </code>
, e comentando as linhas relevantes em enchant.h faz solicitação gtkspell.cenchant_broker_init
ao invés de_imp__enchant_broker_init
, mas não altera os símbolos que aparecem no libenant. Existe uma maneira de fazer o gcc não mangle os nomes, ou alguém tem idéias sobre o que pode estar errado / como consertá-lo?
Aqui está um exemplo mínimo que reproduz o problema no meu sistema:
Se eu tiver um arquivo enchanttest1.c com conteúdo
<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>
e um arquivo enchanttest2.c com conteúdo
<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>
então
<code>gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe </code>
dáEnchant found
mas
<code>gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe </code>
dá
<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>