Ошибка компоновки при использовании статических библиотек Qt

Я разрабатываю нативное приложение на 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-библиотек.

1

Решение

Хотя этот вопрос остался без ответа с конца 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

Надеюсь, это поможет!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]