2015-01-03 1 views
4

Я хочу использовать статическую сборку Qt 5.4. Поскольку нет предустановленной статической сборки, вы должны сами создать ее из исходного кода Qt.Qt 5.4 static build создает ошибку неразрешенного внешнего символа в Visual Studio 2013

Моя среда является следующее:

  • Windows 7 x64
  • Visual Studio 2013 Окончательный Update 4
  • Qt5 Visual Studio надстройки 1.2.4
  • ActivePerl/ActivePython установлен (требуется build Qt source)

Моя процедура была следующей (см. Qt Documentation> Qt 5.4> Qt для Windows - Bui lding от источника):

  • СКАЧАТЬ qt-everywhere-opensource-src-5.4.0.zip
  • Извлечь в папку Темп
  • Откройте командную строку, как описано here (в основном, это похоже на открыть "Visual Studio Command Prompt" и добавив несколько путей к переменной пути)
  • Выполнить настройки с помощью следующей команды

    configure -c++11 -mp -release -static -nomake tests -nomake examples -prefix D:\Qt\qt-5.4.0-x86-msvc2013-compact-static -platform win32-msvc2013 -opengl desktop -no-icu -skip webkit 
    
  • Run nmake и nmake install

Все это пробегают без ошибок.

Затем в Visual Studio я изменил Qt-версию существующего проекта Qt на D:\Qt\qt-5.4.0-x86-msvc2013-compact-static, так как это была выходная папка описанной выше процедуры.

Однако, теперь я получаю тонны неразрешенных ошибок символа в следующем виде (построить конфигурацию «освобождение»):

error LNK2001: unresolved external symbol "[email protected]". Qt5Gui.lib(qopenglfunctions.obj) 
... 
error LNK2001: unresolved external symbol "_hb_blob_create". Qt5Gui.lib(qharfbuzzng.obj) 
... 
error LNK2001: unresolved external symbol "_hb_face_create_for_tables". Qt5Gui.lib(qharfbuzzng.obj) 
.... 
error LNK2001: unresolved external symbol "[email protected]". Qt5Core.lib(qeventdispatcher_win.obj) 

Разделяемая библиотека/динамическое связывание строить с аналогичными опциями (-platform win32-msvc2013 -opengl desktop -no-icu -skip webkit) работает просто отлично.

Что я делаю неправильно?


Update 6 января:

1) Как уже упоминалось в комментариях, это может быть ошибка в Qt, поэтому я создал отчет об ошибке (QTBUG-43636), а затем Я нашел, вероятно, связанную ошибку (QTBUG-38913).(К сожалению, я могу отправить не более 2 ссылки)

2) Я узнал (спасибо karlphillip), что вы можете уменьшить количество сообщений об ошибках, если добавить некоторые библиотеки для ваших дополнительных зависимостей в Visual Studio

  • Ws2_32.lib решает одно сообщение об ошибке (из 103)
  • opengl32.lib решает 47 сообщений об ошибках

Это означает, что теперь "только" 55 error messages left. Может быть, еще не хватает библиотек?

+0

1) Пахнет как ошибка в Qt. Вы считали [сообщение об этом] (http://bugreports.qt-project.org/)? 2) Не являюсь пользователем Windows prouser: вы уверены, что теперь он на 100% поддерживается для предоставления префиксного пути/для запуска make install? – peppe

+0

[Вы видели это?] (Http://qt-project.org/forums/viewthread/10990/#61132) – karlphillip

+0

На веб-сайте написано, что вы можете использовать префикс и nmake install http: //doc.qt. io/qt-5/windows-building.html Добавление imm32.lib winmm.lib Ws2_32.lib не решает проблему. – manuel

ответ

9

Я нашел решение:

Вы должны добавить следующие библиотеки для ваших дополнительных зависимостей в Visual Studio:

Ws2_32.lib opengl32.lib qtharfbuzzng.lib

Тогда мой проект наконец скомпилированный.

Однако, это не конец истории:

Хотя успешно скомпилирован, мое приложение показало следующее сообщение об ошибке при запуске:

Это приложение не удалось запустить, поскольку он не мог найти или загрузить плагин платформы Qt "windows".

Чтобы решить эту проблему, нужно добавить еще больше библиотек для ваших дополнительных зависимостей:

imm32.lib winmm.lib Qt5PlatformSupport.lib qwindows.lib

... и следующее к дополнительной библиотеки каталогов:

$(QTDIR)\plugins\platforms

... и следующее к вашему исходному коду:

#include <QtPlugin> 
Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin) 

Выполнено! Наконец, я смог связать себя со статическими Qt-библиотеками.

Это стоит усилий:

Холодное время запуска моего приложения значительно улучшилось примерно от 10 секунд до менее чем за 1 секунду. И вместо 14 МБ DLL-файлов мне нужно только развернуть один 8 МБ EXE-файл.

+0

Отличный учебник, спасибо. Добавлю только, что при создании статических библиотек необходимо внести изменения в $ {QtDir} \ mkspecs \ win32-msvc2013 \ qmake.conf. Подробности [здесь] (http://stackoverflow.com/a/6494649/1648045). –

+0

@ mr.pohl: Да, если вы хотите связать себя со статическими библиотеками времени исполнения Visual Studio, вам нужно внести эти изменения. Но это не является обязательным, так как вы можете просто попросить конечного пользователя установить соответствующий распространяемый пакет Visual C++. ([см. здесь] (http://stackoverflow.com/questions/21042764/remove-msvc-dlls-dependency-to-run-qt-application)). Кроме того, следует отметить, что Qt рекомендует не связывать себя со статической средой выполнения Visual Studio. ([см. здесь] (http://qt-project.org/faq/answer/why_does_a_static_built_qt_use_the_dynamic_visual_studio_runtime_librar)) – manuel

+0

Thx, но где найти эти зависимости? – xiaohuo