Comment puis-je corriger une référence non définie à _imp __ *?
Je suis en train de compiler quelque chose qui dépend de gtkspell, qui
dépend de l'enchantement, sous MinGW. J'ai des erreurs comme
gtkspell/gtkspell.c:757: undefined reference to '_imp__enchant_broker_init'
Je suppose que c'est soit à cause du fait que je suis en train de lien
contre un {statique,dynamique} bibliothèque, quand je devrais être de se lier à l'
d'autres, ou parce qu'il n'y a qu'un trait de soulignement avant la pmi et de la
il devrait y avoir deux; je obtenir
$ 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
et
$ 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
Internet
(http://lists.freedesktop.org/archives/gstreamer-devel/2007-January/013975.html)
suggère que l'imp mangling vient de
_declspec(dll{import,export})
si enchantement semble utiliser
__declspec(dll{import,export})
et en commentant les lignes correspondantes dans l'enchantement.h fait gtkspell.c
demande enchant_broker_init
plutôt que _imp__enchant_broker_init
, mais
ne change pas les symboles qui apparaissent dans libenchant. Est-il un moyen
pour faire gcc ne pas marquer les noms, ou quelqu'un a des idées sur ce
peut-être aller mal/comment résoudre ce problème?
Voici un exemple minimal qui reproduit le problème sur mon système:
Si j'ai un fichier enchanttest1.c avec le contenu
#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;
}
et un fichier enchanttest2.c avec le contenu
#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;
}
puis
gcc enchanttest1.c `pkg-config --cflags enchant` && ./a.exe
donne Enchant found
mais
gcc enchanttest2.c `pkg-config --cflags enchant` && ./a.exe
donne
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
source d'informationauteur Jason Gross
Vous devez vous connecter pour publier un commentaire.
La façon de réparer mon exemple minimal est d'ajouter
--libs
après--cflags
; gcc ne pouvais pas le trouver à la bibliothèque de lien contre.J'ai été en mesure de résoudre le problème que j'ai été en cours d'exécution pour la plus compliquée de code que j'ai été à l'origine d'essayer de compiler (gummi (http://dev.midnightcoding.org/projects/gummi)) en passant
LDFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)" CFLAGS="$(pkg-config --cflags --libs gtkspell-2.0 enchant)"
au script de configuration; le problème semble avoir été que des arguments de la gcc ont été adoptées dans le mauvais ordre, et il ne pouvait pas trouver enchanter quand il a été tenté de faire le lien gtkspell.