2011-06-26 6 views
11

Estoy intentando compilar usando MTd en Visual Studio 2010 en lugar de MDd (para que los dll estén empaquetados y no necesite distribúyalos con mi exe), pero sigo obteniendo "error fatal LNK1169: uno o más símbolos de multiplicación definida encontrados" durante la compilación. MDd compila bien pero no funciona sin MSVCP100.dll en otras computadoras.No se puede compilar un programa Qt simple en modo MT en comparación con MD en Visual Studio 2010

Estoy usando una compilación estática de Qt y estoy intentando construir el programa Qt predeterminado que viene con el complemento VS.

¿Hay alguna otra manera de obligar al enlazador a compilar estáticamente? Todo lo que intento hacer es distribuir un programa Qt como un exe sin dll.

Aquí está el registro de generación:

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 &)" ([email protected]@@[email protected]@Z) already defined in LIBCMT.lib(stdexcpt.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: virtual __thiscall std::exception::~exception(void)" ([email protected]@@[email protected]) already defined in LIBCMT.lib(stdexcpt.obj) 
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: "public: __thiscall std::exception::exception(class std::exception const &)" ([email protected]@@[email protected]@@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)" ([email protected]@@[email protected]@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 &)" ([email protected]@[email protected]@@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 &)" ([email protected]@[email protected]@@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.  
+0

lo hice hace unos años, pero finalmente decidí que no valía la pena. La gente de Qt quiere que construyas dinámicamente, por lo que tu vida será más fácil si lo haces de esa manera. – user763305

Respuesta

14

Se trata de un error de vinculador estándar cuando jugar con/MT. Ahora está vinculando un código que se compiló con/MT y, por lo tanto, tiene una dependencia del código CRT en libcmt.lib con algún código que se compiló con/MD y, por lo tanto, tiene una dependencia del código CRT en msvcrt.lib. Esto no está permitido, solo puede haber un CRT vinculado a su programa.

Deberá encontrar el código que todavía está compilado con/MD. Este código bien puede existir en .lib, como el código de soporte de tiempo de ejecución para QT. Si QT no tiene una .lib que admita estáticamente la vinculación de la CRT, entonces estás atascado con/MD. Eso no es raro, escribir código que reside en archivos DLL que pueden manejar/MT es difícil.

2

Está vinculando su programa de forma estática y vinculando en contra de libcmt, pero al mismo tiempo, vinculando el código de las DLL de Qt, que son, como su nombre ya dice, vinculadas dinámicamente contra msvcrt.lib.

Tendrá que vincular dinámicamente o recompilar Qt de la fuente como estática, lo cual no es difícil, pero requiere mucho tiempo.

10

puede reconstruir QT para usar bibliotecas de VC estáticas. Voy a ${QtDir}\mkspecs\win32-msvc2010\qmake.conf, y vuelva a colocar

QMAKE_CFLAGS_RELEASE = -O2 -MD 
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi 
QMAKE_CFLAGS_DEBUG  = -Zi -MDd 

con

QMAKE_CFLAGS_RELEASE = -O2 -MT 
QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi 
QMAKE_CFLAGS_DEBUG  = -Zi -MTd 

después de que reconfigure limpia y reconstruir qt

+0

¡Gracias, un hallazgo realmente agradable! – Listing

+0

Esto no funciona para mí, Qt está construido con -MD de todos modos! ¿¿por qué?? –

+0

¿Estás seguro de que usas Visual Studio adecuado? Qt tiene rutas separadas para diferentes versiones vs – Raiv

Cuestiones relacionadas