Impossible de compiler un programme Qt simple en mode MT par opposition à MD dans Visual Studio 2010
Je suis en train de compiler à l'aide de Dmt dans Visual Studio 2010 au lieu de MDd (de sorte que le dll sont emballés et ne pas avoir besoin de les distribuer avec mon exe), mais j'obtiens "erreur fatale LNK1169: un ou plusieurs multiplier les symboles définis trouvé" lors de la compilation. MDd compile bien, mais ne fonctionne pas sans MSVCP100.dll sur d'autres ordinateurs.
Je suis en utilisant une version statique de l'intervalle Qt et je suis en train de construire la valeur par défaut Qt programme qui vient avec le VS ajouter.
Est-il un autre moyen de forcer l'éditeur de liens pour compiler statiquement? Tout ce que je suis en train de faire est de distribuer un programme Qt comme un exe sans dll.
Ici est le journal de l':
1>ClCompile:
1> All outputs are up-to-date.
1> cooltest1.cpp
1> moc_cooltest1.cpp
1> main.cpp
1> Generating Code...
1> All outputs are up-to-date.
1> qrc_cooltest1.cpp
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: __thiscall std::exception::exception(char const * const &)" (??0exception@std@@QAE@ABQBD@Z) already defined in LIBCMT.lib(stdexcpt.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" (??1exception@std@@UAE@XZ) already defined in LIBCMT.lib(stdexcpt.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" (??0exception@std@@QAE@ABV01@@Z) already defined in LIBCMT.lib(stdexcpt.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _memmove already defined in LIBCMT.lib(memmove.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strncmp already defined in LIBCMT.lib(strncmp.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isupper already defined in LIBCMT.lib(_ctype.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isalpha already defined in LIBCMT.lib(_ctype.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isdigit already defined in LIBCMT.lib(_ctype.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _isspace already defined in LIBCMT.lib(_ctype.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: __control87 already defined in LIBCMT.lib(_ieee87_.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: __clearfp already defined in LIBCMT.lib(_ieee87_.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strncpy_s already defined in LIBCMT.lib(strncpy_s.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _strcpy_s already defined in LIBCMT.lib(strcpy_s.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _realloc already defined in LIBCMT.lib(realloc.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: __thiscall std::exception::exception(char const * const &,int)" (??0exception@std@@QAE@ABQBDH@Z) already defined in LIBCMT.lib(stdexcpt.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _exit already defined in LIBCMT.lib(crt0dat.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: __errno already defined in LIBCMT.lib(dosmap.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _abort already defined in LIBCMT.lib(abort.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMT.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>c:\users\username\documents\visual studio 2010\Projects\CoolTest1\\CoolTest1.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.
source d'informationauteur wes
Vous devez vous connecter pour publier un commentaire.
C'est un standard de l'éditeur de liens d'erreur lorsque vous bricoler avec /MT. Vous êtes maintenant en reliant un code qui a été compilé avec /MT et a donc une dépendance sur le code CRT dans libcmt.lib avec un code qui a été compilé avec /MD et a donc une dépendance sur le code CRT dans msvcrt.lib. Ce n'est pas autorisé, il peut y avoir qu'un CRT lié à votre programme.
Vous aurez besoin de trouver le code qui est toujours compilé avec /MD. Ce code peut bien exister dans un .lib, comme le support d'exécution de code pour QT. Si l'intervalle QT n'a pas .lib qui prend en charge la liaison statique de la CGT puis vous êtes coincé avec /MD. Ce n'est pas rare, à l'écriture de code qui vit dans les Dll qui peut traiter avec /MT est difficile.
vous pouvez reconstruire QT pour utilisation statique VC bibliothèques. Aller à
${QtDir}\mkspecs\win32-msvc2010\qmake.conf
et remplaceravec
après que la propreté de reconfigurer et de reconstruire qt
Vous lier votre programme de manière statique et de se lier à des
libcmt
mais dans le même temps, la liaison dans le code de l'intervalle Qt Dll, qui sont, comme le nom l'indique déjà, liée de façon dynamique à l'encontre demsvcrt.lib
.Vous devez le lier dynamiquement ou recompiler Qt à partir de la source statique, ce qui n'est pas difficile, mais demande du temps.