7
votes

Références non définies lorsque vous essayez de lier une application QT avec ma bibliothèque statique

J'ai une bibliothèque statique que je l'ai construit avec MinGW, je suis en train de lien vers cette bibliothèque à partir d'une application Qt. Je continue de recevoir des erreurs de l'éditeur de liens causés par l'un des fichiers objets dans la bibliothèque. Ce fichier déclare en fait deux ou trois têtes de Boost, une pour l'utilisation de shared_ptr et l'autre pour que je puisse faire une classe noncopyable. Je crois que l'utilisation de cette fonctionnalité de boost est ce qui est l'origine du problème, mais je ne sais pas pourquoi. Si je commente les classes dans l'application Qt qui utilisent la classe définie dans le fichier, l'application Qt liens ténus. Ceci est la partie d'erreur de la sortie:

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj): foo_ctis.cpp :( texte + 0x10a).: undefined reference to `__Gxx_personality_sj0'

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte + 0x12f): undefined reference to `_Unwind_SjLj_Register '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte + 0x203): undefined reference to `_Unwind_SjLj_Resume '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte + 0x20e): undefined reference to `_Unwind_SjLj_Unregister '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte + 0x226): undefined reference to `__Gxx_personality_sj0'

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte + 0x24b): undefined reference to `_Unwind_SjLj_Register '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte + 0x31f): undefined reference to `_Unwind_SjLj_Resume '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj): foo_ctis.cpp :( texte + 0x32a).: undefined reference to `_Unwind_SjLj_Unregister '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: détail :: :: shared_count shared_count (foo :: foo_SomeClassImpl *)] + 0xc): undefined reference to `__Gxx_personality_sj0'

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: détail :: :: shared_count shared_count (foo :: foo_SomeClassImpl *)] + 0x31): undefined reference to `_Unwind_SjLj_Register '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: détail :: :: shared_count shared_count (foo :: foo_SomeClassImpl *)] + 0xFB): undefined reference to `_Unwind_SjLj_Resume '

C: \ blah \ build \ windows \ MinGW \ libtruc.a (foo_ctis.cpp.obj):. Foo_ctis.cpp :( texte $ _ZN5boost6detail12shared_countC1IN3foo25foo_SomeClassImplEEEPT_ [boost :: détail :: :: shared_count shared_count (foo :: foo_SomeClassImpl *)] + 0x106): undefined reference to collect2 `_Unwind_SjLj_Unregister »: ld 1 retourné état de sortie

Une autre chose à mentionner est que j'utilise un pointeur vers la mise en œuvre dans cette classe. Toute aide serait très apprécié.

Résolu: Je me suis dit que j'avais une ancienne version de GCC dans mon chemin qui a été inclus Beng avant mon MinGW fourni la version GCC. L'ancienne version a été inclus dans un forfait GNUStep que j'avais de quelque temps en arrière. Je pense que la configuration de ces versions différentes a été à l'origine des problèmes. Merci à kemiisto, qui était sur la bonne voie dans la résolution de la question.


0 commentaires

3 Réponses :


3
votes

Il semble que votre bibliothèque statique était liée à une distribution MingW (c'est-à-dire une version 3ème), mais vous essayez de lier votre application avec cette bibliothèque à l'aide d'une autre distribution MingW (c'est-à-dire la 4ème version qui est distribuée avec un QT binaire). Vous devriez reconstruire votre bibliothèque en utilisant le même Mingw que vous utilisez pour votre développement d'applications.

Mise à jour

Peut-être que c'est un autre problème bien connu. Jetez un coup d'œil à Ce sujet . Vous avez probablement 2 dossiers différents avec qt libs xxx

dans votre chemin aussi. Bibliothèques dans le premier dossier (... \ bin) compilée avec VS2008 et des bibliothèques dans la seconde (... \ qt \ bin) compilée avec Mingw. Les éléments de la variable de chemin sont levés lorsque votre application commence. Soudainement, le dossier avec des "mauvaises" bibliothèques existe avant le dossier avec l'élément correct de la variable de votre chemin. Ce que vous pouvez faire est de copier qtcore4.dll, qtgui4.dll et d'autres bibliothèques dont vous avez besoin pour votre dossier avec votre exécutable de l'application. J'espère que cela aide.

Quelques liens sur ce problème:


4 commentaires

Bonjour Kemiisto, merci pour votre réponse. Je crois que j'utilise la même version de Mingw. J'utilise CMAKE pour construire différents types de maquillages. J'ai essayé de construire des makefiles pour Mingw et je reçois des erreurs de sorte que j'ai inclus C: \ qt \ 2009.05 \ mingw \ bin dans mon chemin d'invite de commande. Une fois que cette cmake était capable de générer les maquillages Mingw et j'ai pu utiliser Mingw32-faire pour construire la bibliothèque statique. Cela ne veut-il pas utiliser la même version? Je ne pense pas avoir une autre version sur mon ordinateur.


@csmithmaui: Dans ce cas, j'ai une autre idée. J'ai ajouté des informations à mon message.


J'ai analysé mon chemin et je n'ai réellement pas l'un de ceux que vous avez posté ci-dessus. Je viens d'avoir c: \ qt \ 2009.05 \ mingw \ bin. Ma bibliothèque statique construit une amende à l'invite de commande après inclure le chemin de Mingw que je viens de la conditionner. Le problème est que j'essaie de créer un lien vers ma bibliothèque à partir de QTCreator, je reçois les erreurs de liaison. J'ai lu à travers les liens que vous avez postés mais je ne pense pas que ce soit mon problème. De plus, si je retiens des références à la classe contenues par le fichier en question, tout le reste relie bien. J'apprécie vraiment votre aide.


Je voulais vous faire savoir que vous étiez sur la bonne voie en résolvant les problèmes que j'avais la semaine dernière. Il s'est avéré que Gnustep a été induit dans mon chemin et que la GCC incluse avec elle était utilisée pour construire ma bibliothèque, ce qui a été incompatible avec l'application QT qui utilisait le Mingw GCC. Merci.



2
votes

Juste au cas où quelqu'un d'autre a ce problème: mon projet de reconstruction utilisait .o des fichiers d'une version précédente. J'ai changé de compilateurs entre les deux.

s'avère que lorsque j'ai reconstruit le même projet, le nouveau compilateur n'a pas construit de nouveaux fichiers , il manque donc des informations clés. Après avoir supprimé les anciens fichiers et la reconstruction, l'erreur a été corrigée.

Je suppose reconstruire à partir de zéro, sans la suppression, fonctionnerait la même chose.


0 commentaires

0
votes

Vous avez peut-être utilisé gcc au lieu de g ++ . GCC est un compilateur C. Mais g ++ est un compilateur C ++.

Assurez-vous d'utiliser G ++ si vous avez des fichiers .cpp.


0 commentaires