2010-08-12 2 views
7

Au travail, nous avons une DLL d'extension MFC qui construit très bien avec 1,35 mais quand construit avec 1,43 provoque l'erreur suivante:Mise à niveau de BOOST 1,35 à 1,43 provoque une erreur de liaison avec __pRawDllMain (mfc lié)

error LNK2005: __pRawDllMain already defined in ApObs.obj 

Si je BOOST_LIB_DIAGNOSTIC les anciennes activer les listes de construction:

linking to lib file: libboost_thread-vc71-mt-gd-1_35.lib 

et

linking to lib file: libboost_thread-vc71-mt-gd-1_43.lib 

donc pas chan ge là avec quelle bibliothèque est liée

Le message d'erreur complet est:

libboost_thread-vc71-mt-gd-1_43.lib(tss_pe.obj) : error LNK2005: __pRawDllMain already defined in ApObs.obj 

je l'ai fait un diff sur tss_pe.cpp dans les deux versions de la bibliothèque et ils sont identiques, donc je ne suis pas sûr de ce que la Le problème est.

Vous pouvez faire disparaître le message en définissant BOOST_THREAD_USE_DLL mais nous aurions besoin d'expédier BOOST_THREAD-VC71-MT-GD-1_43.DLL donc je ne pense pas que ce soit la meilleure solution.

+0

vous mentionnez deux fois 1,36, b la sortie de l'éditeur de liens dit 1.35? –

+0

Merci, corrigé –

Répondre

0

Cela se produit en raison de l'ordre de liaison.
Vous pouvez modifier l'erreur de liaison en ajoutant manuellement les bibliothèques dans les dépendances supplémentaires.
Dans mon cas, mettre libboost_thread-vc71-mt-GD-1_43.lib avant l'autre lib en conflit résolu le problème:

Projet -> Propriétés -> Propriétés de configuration -> Linker -> Entrée -> Dépendances supplémentaires

libboost_thread-vc80-mt-1_40.lib; mfcs80u.lib;% (AdditionalDependencies)

Notez que dans mon cas, il a été en conflit avec mfcs80u.lib

+0

Je ne suis plus dans cette entreprise, et je pense qu'à la fin ils sont passés à la version DLL, mais je pense que votre réponse est correcte, donc je vais la marquer comme telle –

1

Il existe une incompatibilité connue entre MFC et Thread boost lié statiquement, tous deux essayant de se connecter à DllMain pour initialiser des données. Cela a été introduit dans boost 1.37.

From the author of boost::thread:

If you can ensure that on_process_exit from boost/thread/detail/tss_hooks.hpp is called when the DLL is unloaded then you can patch libs/thread/src/win32/tss_pe.cpp to remove the use of _pRawDllMain.

(Il recommande d'utiliser la version DLL, cependant.)

Il semble y avoir été efforts pour rendre ce rapiéçage inutile, mais apparemment sans succès jusqu'à présent ...

+0

En commençant par Boost 1.52 [c'est possible] (http://stackoverflow.com/a/34769235/1969455). –

Questions connexes