Я разрабатываю нативное приложение на C ++ с использованием Qt 4.8.3 и VS2008. Поскольку клиенты запускают приложение на своих голых компьютерах, им необходимо установить пакет распространения VC ++ 2008. Поэтому я решил сделать его статически связанным.
Я изменил настройки своего проекта (C / C ++> Генерация кода> Библиотека времени выполнения) на / MTd. Также
Я снова скомпилировал Qt, на этот раз используя следующие команды для статического здания; изначально найден в этом блоге Статический Qt со статическим ЭЛТ (VS 2008)
1- replaced -MD with -MT in lines QMAKE_CFLAGS_RELEASE and QMAKE_CFLAGS_DEBUG in %QDIR%\mkspecs\win32-msvc2008\qmake.conf
2- nmake confclean
3- configure -static -platform win32-msvc2008 -no-webkit
4- nmake sub-src
Я успешно скомпилировал Qt. Но когда я снова попытался скомпилировать свое приложение, оно дало мне странные ошибки.
1>Linking...
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: bool __thiscall QBasicAtomicInt::deref(void)" (?deref@QBasicAtomicInt@@QAE_NXZ) already defined in QtCored4.lib(QtCored4.dll)
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: bool __thiscall QBasicAtomicInt::operator!=(int)const " (??9QBasicAtomicInt@@QBE_NH@Z) already defined in QtCored4.lib(QtCored4.dll)
1>qtmaind.lib(qtmain_win.obj) : error LNK2005: "public: __thiscall QString::~QString(void)" (??1QString@@QAE@XZ) already defined in QtCored4.lib(QtCored4.dll)
Я изменил некоторые файлы lib, но с каждым изменением ситуация ухудшалась; например, я попытался использовать QtCored.lib вместо QtCored4.lib, потому что он создается заново после компиляции.
Я думаю, что что-то упустил при создании статических Qt-библиотек.
Хотя этот вопрос остался без ответа с конца 2012 года, я подумал, что было бы неплохо дополнить общие знания по этой проблеме, чтобы каждый поток отображал хотя бы один ответ.
Проблема связана с включением QtCored4.dll и QtGuid4.dll в процессе компоновки при статической сборке Qt. Чтобы исключить их из процесса сборки, просто добавьте QT_NODLL в качестве директивы препроцессора при настройке Makefile. Например, это может быть достигнуто с помощью следующей команды (для Microsoft Visual Studio 2008):
configure -static -debug -D QT_NODLL -platform win32-msvc2008
до запуска NMAKE.
Хорошей практикой при создании статических приложений Qt с использованием IDE Visual Studio является изменение типа конфигурации проекта на Makefile с использованием Свойства конфигурации-> Общие-> Тип конфигурации выпадающее меню. После применения этих настроек пользователь также может указать QMAKE а также NMAKE шаги для выполнения строить а также Восстановить все варианты под Свойства конфигурации-> Общие-> NMake.
Например, командная строка для статической конфигурации отладки будет выглядеть так:
nmake debug
И перестроить-все равно
qmake app_debug.pro && nmake debug
Надеюсь, это поможет!
Других решений пока нет …