7
votes

Erreur de liaison lors de l'utilisation de qt et de boost

Quand j'utilise Qt (V4.7.4) et Boost (essayé V1.47 et V1.48) dans mon projet C ++, j'obtiens une erreur de liaison causée par une classe comprenant . Je viens de configurer qt et avant que le code ne fonctionnait sans aucun problème.

Ceci est le message d'erreur:

... obj: Erreur LNK2001: Symbole externe non résolu "Privé: Statique Classe STD :: Codecvt Const * & __CDecl boost :: FileSystem3 :: chemin :: wchar_t_codecvt_facet (void)" (? wchar_t_codecvt_facet @ path @ FileSystem3 @ boost @@ caaapbv? $ Codecvt @ gdh @ std @@ xz)

... obj: Erreur LNK2001: Symbole externe non résolu "Void __cdecl boost :: FileSystem3 :: PATH_TRAITITS :: Convertir (Char Const *, Constons *, classe STD :: basique_string, classe STD :: Allocator> &, Classe STD :: CODECVT Const &) "(? Convertir @ path_traits @ FileSystem3 @ keySystem3 @ boost @@ yaxpbd0aav? $ basic_string @ g @ g @ g @ g @ @ @ @@ ABV? $ codecvt @ gdh @ 5 @@ z)

... Obj: Erreur LNK2001: Symbole externe non résolu "Void __cdecl boost :: FileSystem3 :: Path_Traits :: Dispatch (Classe Boost :: FilesSystem3 :: Directory_entry const &, classe STD :: basique_string, classe std :: allocator > &, CLASS STD :: CODECVT Const &) "(? Dispatch @ path_traits @ filesSystem3 @ boost @@ yaxabvdirectory_ientry @ 23 @ aav? $ basic_string @ g @ g @@ v? $ allocator @ g @ 2 @@ std @@ abv? $ codecvt @ gdh @ 6 @@ z)

... obj: Erreur LNK2001: Symbole externe non résolu "Void __cdecl boost :: FileSystem3 :: Path_Traits :: Convertir (non signé Const *, STD STD *, STD STD :: basique_string, classe STD :: Allocator> &, classe STD :: Codecvt const &) "(Convert @ path_traits @ filesSystem3 @ boost @@ yaxpbg0aav? $ basic_string @ d @ star_traits @ d $ allocator @ d @ 2 @@ Abv? $ Codecvt @ gdh @ 5 @@ z)

... EXE: Erreur fatale LNK1120: 4 externes non résolus

EDIT:

ici j'ai trouvé quelqu'un avoir ce problème à venir cette conclusion:

Ceci est vraiment un problème QT. En utilisant wchar_t comme type natif que vous devez Recompiler QT en utilisant le même commutateur de compilateur. Il y a même un bug dans le Tracker: https://bugreports.qt.io/browse/qtbug-9617 < / p>

En général, vous devrez faire très attention et ne pas mélanger WCHAR_T Paramètres du compilateur dans vos projets car ils deviendront incompatibles.

donc je recompilé Réglage QT / ZC: wchar_t , mais cela n'a montré aucun effet. Je reçois toujours la même erreur.


8 commentaires

Avez-vous compilé Boost? Je ne suis pas trop familier avec ce qui nécessite exactement la construction, mais certaines bibliothèques font.


Oui. Je l'ai compilé pour Visual Studio 2010 en utilisant b2.exe si je me souviens bien.


pourrait-il être nécessaire de recompiler toute la bibliothèque de boost? Je ne me souviens pas de la configuration de construction exacte, mais je n'ai définitivement pas changé Traiter WCHAR_T en tant que propriété Build-in Type lorsque j'étais compilé boost.


Pourriez-vous inclure au moins une ligne de votre sortie du compilateur? Peut-être cl ... ? Cela me semble que votre / zc: wchar_t n'a pas pris pour une raison quelconque. Votre sortie du compilateur montrait que.


Cette information est-elle stockée quelque part? Comme la compilation prend quelques heures, je ne voudrais pas recompiler sauf si nécessaire. Quoi qu'il en soit, c'est comme ça que j'ai défini wchar_t: qmake_cflags = -nologo -zm200 -zc: wchar_t . Ceci est le fichier édité: $ (boost) \ mkspecs \ win32-msvc2010 \ qmake.conf . J'avais un coup d'œil à $ (boost) \. Qmake.cache et remarqua que qmakespec pointe vers le même répertoire où j'ai fait le changement.


Pourriez-vous me montrer un exemple comment utiliser cl pour obtenir les informations que vous recherchez?


Désolé, je voulais juste dire lorsque vous compilez le programme qui cause le problème. La fenêtre "Compile Sortie" affiche les commandes utilisées pour compiler le programme. Vous devriez avoir quelque chose comme CL -C -NOGO -ZM200 -ZC: WCHAR_T -ZI -MDD -GR -EHSC -W3 -W34100 -W34189 -WX ... bla ... bla ... bla >


Merci, tu avais raison. J'ai oublié de mettre / zc: wchar_t dans mon projet. Eh bien, si postez une réponse, vous pouvez avoir la prime;)


3 Réponses :


0
votes

QT a probablement changé la tipologie de votre programme en ce qui concerne la configuration du temps d'exécution: par conséquent, la bibliothèque de boost que vous utilisez (système de fichiers), qui vient dans de nombreuses configurations accédées par la convention de dénomination - connot être trouvé.

Par exemple, les roulements multithread nécessitent mt quelque part dans le nom de la bibliothèque (j'espère que je me souviens bien, mais de toute façon voir les documents où les détails sont entièrement documentés). Cette nommée est assez transparente au programmeur, en raison de pragmas qui stimulent les programmeurs de manière appropriée pour faciliter l'utilisation de la bibliothèque sous différents compilateurs.

Vous devez manquer le système de fichiers non-WCHAR.Lib. Lorsque j'utilisais Windows, j'ai utilisé Boost Jam pour interfacer avec Visual C ++ (peut être qui remonte au passé millénaire !). J'espère que c'est toujours utilisable.


2 commentaires

Je ne suis pas sûr de comprendre. J'ai ajouté boost_filesystem-vc100-mt-1_47.lib à mes dépendances et $ (boost) \ state \ lib aux répertoires. Les chemins sont vraiment corrects, je les ai copiés d'un autre projet, qui compilait sans erreurs. J'ai vérifié la propriété Runtime Library de toutes mes feuilles et elles sont toutes définies sur DLL multithreaded (/ MD) , comme dans mon autre projet. Puisque ces paramètres sont les mêmes, je suppose que cela ne peut pas être un problème de nommage, ou je me trompe?


Désolé, j'ai mal tourné à Multhread, et donc MT , vous avez clairement expliqué que c'était un changement de type de caractère. J'espère pouvoir vérifier mon hipotèse dans Boost, détail technique approprié.



8
votes

Je pense que vous êtes sur la bonne voie, mais cela ressemble à votre -zc: wchar_t n'a pas "collé". Nous avons dû faire la même chose pour rendre Qt heureux avec Google Breakpad et la bibliothèque ICU. Nous avons modifié le / zc: wchar_t paramètres dans (qt_source) \ mkspecs \ win32-msvc2008 \ qmake.conf et compilé qt de la source et après que tout fonctionne.

Lorsque vous construisez votre projet qui utilise QT et Boost, vous devez voir cette option dans la sortie du compilateur. Quelque chose comme: xxx

Si vous avez déjà construit qt sans cette option, vous devrez peut-être avoir à faire un faire conflclean d'abord pour que tout vraiment est reconstruit avec les nouveaux paramètres.

Ça sonne comme - ZC: wchar_t sera la valeur par défaut dans qt 5 .


0 commentaires

2
votes

Utiliser Boost-1.49, Qt 4.4 et VS2005 avaient le même problème. Aller aux propriétés du projet, puis régler "Propriétés de configuration -> C / C ++ -> Langue -> Traiter wchar_t comme type intégré" sur "Oui" Correction du problème.


0 commentaires