2016-12-16 10 views
4

Я создал CMakeLists.txt для создания простого приложения Qt (на самом деле он имеет только один файл main.cpp показывая пустое главное окно):развернуть все зависимости Qt при сборке

cmake_minimum_required (VERSION 3.7.0) 

project(guitest) 

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 
set(CMAKE_INCLUDE_CURRENT_DIR ON) 
set(CMAKE_AUTOMOC ON) 

find_package(Qt5Widgets REQUIRED) 
include_directories (${CMAKE_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}) 
file (GLOB_RECURSE WSIMGUI_SRC *.cpp) 

add_executable(${PROJECT_NAME} ${WSIMGUI_SRC}) 
target_link_libraries(${PROJECT_NAME} Qt5::Widgets) 
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:${PROJECT_NAME}>) 

Проект строит и add_custom_command копирует Qt5Widgets.dll файл для вывода каталога. Но когда я пытаюсь запустить программу, я получаю следующее сообщение об ошибке:

This application failed to start because it could not find or load the Qt platform plugin "windows" in "".

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

Как это сделать в моем файле CMakeLists.txt?

ответ

7

Qt предоставляет утилиту для развертывания зависимостей в Windows: windeployqt.

Учитывая вашу установку Qt находится в <qt_install_prefix>, вы должны использовать следующие команды:

set PATH=%PATH%;<qt_install_prefix>/bin 
windeployqt --dir /path/to/deployment/dir /path/to/qt/application.exe 

Удобный способ использовать windeployqt с CMake является первым объявить импортную цель:

find_package(Qt5 ...) 

if(Qt5_FOUND AND WIN32 AND TARGET Qt5::qmake AND NOT TARGET Qt5::windeployqt) 
    get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION) 

    execute_process(
     COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX 
     RESULT_VARIABLE return_code 
     OUTPUT_VARIABLE qt5_install_prefix 
     OUTPUT_STRIP_TRAILING_WHITESPACE 
    ) 

    set(imported_location "${qt5_install_prefix}/bin/windeployqt.exe") 

    if(EXISTS ${imported_location}) 
     add_executable(Qt5::windeployqt IMPORTED) 

     set_target_properties(Qt5::windeployqt PROPERTIES 
      IMPORTED_LOCATION ${imported_location} 
     ) 
    endif() 
endif() 

Затем вы можете использовать его следующим образом:

add_executable(foo ...) 

if(TARGET Qt5::windeployqt) 
    # execute windeployqt in a tmp directory after build 
    add_custom_command(TARGET foo 
     POST_BUILD 
     COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/windeployqt" 
     COMMAND set PATH=%PATH%$<SEMICOLON>${qt5_install_prefix}/bin 
     COMMAND Qt5::windeployqt --dir "${CMAKE_CURRENT_BINARY_DIR}/windeployqt" "$<TARGET_FILE_DIR:foo>/$<TARGET_FILE_NAME:foo>" 
    ) 

    # copy deployment directory during installation 
    install(
     DIRECTORY 
     "${CMAKE_CURRENT_BINARY_DIR}/windeployqt/" 
     DESTINATION ${FOO_INSTALL_RUNTIME_DESTINATION} 
    ) 
endif() 

Это можно (следует?) Внедрить в функцию cmake.


Обратите внимание, что с помощью GLOB для сбора исходных файлов не рекомендуется в CMake's doc:

We do not recommend using GLOB to collect a list of source files from your source tree. If no CMakeLists.txt file changes when a source is added or removed then the generated build system cannot know when to ask CMake to regenerate.


Если вы используете Visual C++, вы можете также установить визуальный распространяемый, добавив следующее код в конце вашего CMakeLists.txt файл:

set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) 

include(InstallRequiredSystemLibraries) 

install(
    PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} 
    DESTINATION ${FOO_INSTALL_RUNTIME_DESTINATION} 
) 

Вы можете взглянуть на один из моих проектов, названный Softbloks, для полной и рабочей интеграции windeployqt и InstallRequiredSystemLibraries.

 Смежные вопросы

  • Нет связанных вопросов^_^