Невозможно скомпилировать простую программу Qt в режиме MT, в отличие от MD в Visual Studio 2010

Я пытаюсь скомпилировать с помощью MTd в Visual Studio 2010 вместо MDd (чтобы DLL упакована, и мне не нужно будет распространять их с моим exe), но я продолжаю получать "фатальную ошибку LNK1169: один или более многократно определенных символов, найденных" во время компиляции. MDd компилируется отлично, но не работает без MSVCP100.dll на других компьютерах.

Я использую статическую сборку Qt, и я пытаюсь создать стандартную программу Qt, которая поставляется с надстройкой VS.

Есть ли другой способ заставить компоновщик скомпилировать статически? Все, что я пытаюсь сделать, это распространять программу Qt как exe без dll.

Вот журнал сборки:

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]@[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.     

Ответ 1

Это стандартная ошибка компоновщика, когда вы возитесь с /MT. Теперь вы связываете некоторый код, который был скомпилирован с /MT и, следовательно, имеет зависимость от кода CRT в libcmt.lib с некоторым кодом, который был скомпилирован с /MD и, следовательно, имеет зависимость от кода CRT в msvcrt.lib. Это недопустимо, в вашу программу может быть включен только один CRT.

Вам нужно будет найти код, который все еще скомпилирован с помощью /MD. Этот код вполне может существовать в .lib, как и код поддержки во время выполнения для QT. Если QT не имеет .lib, который поддерживает статически связывание CRT, то вы застряли с /MD. Это не редкость, писать код, который живет в DLL, который может иметь дело с /MT, трудно.

Ответ 2

вы можете перестроить QT для использования статических библиотек VC. Перейдите к ${QtDir}\mkspecs\win32-msvc2010\qmake.conf и замените

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

с

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

после этого очистить реконфигурирование и перестроить qt

Ответ 3

Вы связываете свою статическую стратегию и связываете ее с libcmt, но в то же время связываете код из Qt DLL, которые, как уже сказано, динамически связаны с msvcrt.lib.

Вам нужно либо динамически связываться, либо перекомпилировать Qt из источника как статический, что не сложно, но требует много времени.