2017-01-28 1 views
2

와 cmake 프로젝트를 연결 :배포 ICU 라이브러리 I는 약간의 응용 프로그램을 만들기위한 <code>CMakeLists.txt</code> 다음 한 Qt5

cmake_minimum_required (VERSION 3.5.0) 

project (sampleapp) 

# Setting project flags 
set (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/lib) 
set (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/lib) 
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/build/bin) 
set (CMAKE_INCLUDE_CURRENT_DIR ON) 
set (CMAKE_AUTOMOC ON) 

# Finding needed packages 
find_package (Qt5Widgets REQUIRED) 
find_package (Qt5Core REQUIRED) 
find_package (Qt5Gui REQUIRED) 

# Setting project files 
include_directories (${CMAKE_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}) 
file (GLOB_RECURSE PROJECT_SRC *.cpp) 

# Creating project 
add_executable(${PROJECT_NAME} ${PROJECT_SRC}) 

# Linking dependencies 
target_link_libraries (${PROJECT_NAME} somelibrary Qt5::Widgets Qt5::Gui Qt5::Core) 
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(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Gui> $<TARGET_FILE_DIR:${PROJECT_NAME}>) 
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Core> $<TARGET_FILE_DIR:${PROJECT_NAME}>) 

나는 그것을 실행 한 다음 Qt는 DLL을 대상 폴더에 복사하는 응용 프로그램을 구축 할 수 있습니다. 특히 나는 복사 :

  • Qt5Widgets.dll
  • 내가 Qt를 위해 필요한 ICU 라이브러리를 복사하지 않기 때문에 어쨌든 시작되지 않는 응용 프로그램을 실행

    • Qt5Core.dll
    • Qt5Gui.dll
    • . 나는 응용 프로그램을 시작하면, 윈도우는 다음 라이브러리가 누락 된 것을 저에게 말한다 : 나는 Qt는 insallation 폴더에서 수동으로 라이브러리를 복사 할 경우

      • icuin53.dll
      • icuuc53.dll

      가 작동 (좋아, 내가했습니다 "플랫폼 플러그인 창"에 관한 오류가 누락되었지만 또 다른 이야기입니다.)

      라이브러리를 복사하는 데 사용하는 빌드 빌드 명령과 같은 표준 방식으로 icu 라이브러리를 복사 할 수 있습니까? 가능한 경우 투명하게 복사하는 가장 좋은 방법은 무엇입니까 (CMake는 Qt의 종속성을 알 수 있고 Qt가 필요한 곳에 복사 할 수 있습니다).

    +0

    'CMake는 Qt를의 의존성이하고 어디를 복사 것을 알 수 있습니다 Qt가 필요합니다'- CMake 자체는 모든 depdendent 라이브러리를 복사하는 기능이 없습니다. – Tsyvarev

    +0

    Qt와 함께이 라이브러리를 복사하는 가장 좋은 방법은 무엇입니까? – Jepessen

    +0

    필자가 이해하는 한, CMake는 ** 3di 파티 라이브러리 **를 ** 잘못된 디자인 **으로 실행 가능한 디렉토리로 복사합니다. 개발자의 관점에서 볼 때, 3d 파티 라이브러리는 * system-wide *로 설치해야 실행 파일에서로드 할 수 있습니다. 귀하의 문제가 사실임을 이해하는 동안 나는 결정을 모릅니다. – Tsyvarev

    답변

    4

    각 dll을 직접 복사하는 대신 Qt와 함께 제공되는 Windows 용 배포 도구 windeployqt을 사용하여 모든 Qt 종속성을 설치할 수 있습니다. 먼저 가져온 실행 파일 windeployqt를 선언 할 수

    :

    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) 
        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:foo>" 
        ) 
    
        install(
         DIRECTORY 
         "${CMAKE_CURRENT_BINARY_DIR}/windeployqt/" 
         DESTINATION ${FOO_INSTALL_RUNTIME_DESTINATION} 
        ) 
    endif() 
    
    +0

    좋아요! 고마워, 이것이 내가 필요로하는 도구이다. 나는이 모든 것을 처리하고 별도의 파일에 넣기 위해 cmake 함수를 생성하기 만하면된다. 그래서 모든 프로젝트에서 bloating하지 않고 사용할 수있다. 다시 한번 감사드립니다. – Jepessen

    +1

    '$ /$ '를'$ '로 대체 할 수 없습니까? 후자는 대상에 대한 전체 경로입니다. 즉 대상과 함께 구성하려고하는 대상입니다. 내가 잘못? – skypjack

    +0

    @skypjack이 옳았다. 나는 내 대답을 편집했다. 고마워 :) – wasthishelpful

    관련 문제