2017-02-03 7 views
0

저는 qml (qt)을 gui로, itk 및 opencv를 사용하여 이미지 처리 작업을위한 cmake 프로젝트를 진행했습니다. 이 프로그램은 Visual Studio에서 잘 실행되지만, 다른 사람들을 위해 exe로 배포해야합니다. ,ITake, openCV 및 Qt가 포함 된 CMake 프로그램 -> 모든 것을 포함하는 exe를 얻는 방법

cmake_minimum_required(VERSION 2.8) 

project(VisuRysm) 
set(TEMPLATE_NAME "VisuRysm" CACHE STRING "app name") 

if(APPLE) 
    set(EXECUTABLE "${TEMPLATE_NAME}.app") 
endif() 
if(WIN32) 
    #set(EXECUTABLE "$(TEMPLATE_NAME}.exe") 
    set(QT_USE_QMAIN TRUE) 
endif() 

# set the version number 
set (VisuRysm_VERSION_MAJOR 2) 
set (VisuRysm_VERSION_MINOR 0) 

# configure a header file to pass some of the CMake settings to the  source code 
configure_file (
    "${PROJECT_SOURCE_DIR}/cmake/VisuRysmConfig.h.in" 
    "${PROJECT_BINARY_DIR}/cmake/VisuRysmConfig.h" 
) 
include_directories("${PROJECT_BINARY_DIR}") 
# ITK 
# *********************************************************************** 
find_package(ITK REQUIRED) 
include(${ITK_USE_FILE}) 

# Qt 
# *********************************************************************** 
set(TEMPLATE_QT_VERSION "5.7.0" CACHE STRING "Qt Version") 
set(TEMPLATE_QT_MODULES Core Gui Widgets Quick Qml Concurrent Multimedia  Network DBus PrintSupport) 
set(QT_USE_QMAIN TRUE) 

find_package(Qt5 ${TEMPLATE_QT_VERSION} EXACT CONFIG REQUIRED  ${TEMPLATE_QT_MODULES}) 


# OpenCV 
# *********************************************************************** 
#set(OpenCV_DIR "C:/opencv/build") 
FIND_PACKAGE(OpenCV REQUIRED) 
include_directories(${OpenCV_INCLUDE_DIRS}) 

# meta 
# *********************************************************************** 
set(TEMPLATE_VERSION_MAJOR 1 CACHE INT "Version Major") 
set(TEMPLATE_VERSION_MINOR 0 CACHE INT "Version Minor") 
set(TEMPLATE_VERSION_PATCH 0 CACHE INT "Version Patch") 
set(TEMPLATE_ORGANIZATION "foo" CACHE STRING "Organization") 
set(TEMPLATE_DOMAIN "" CACHE STRING "") 

option(CMAKE_AUTOMOC "Use Automoc" ON) 
option(TEMPLATE_USE_QT "Use Qt" ON) 

set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER autogen) 


# central paths 
# ********************************************************************** 
SET(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 
set(CMAKE_INSTALL_PREFIX ${ROOT_DIR}/install) 

set(INSTALL_DIR ${CMAKE_INSTALL_PREFIX}) 
set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) 
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 
set(BUILD_DIR ${ROOT_DIR}/build) 

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${BUILD_DIR}) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${BUILD_DIR}) 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BUILD_DIR}) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIR}) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIR}) 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${BUILD_DIR}) 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIR}) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIR}) 
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${BUILD_DIR}) 

add_definitions(${QT_DEFINITIONS}) 

get_filename_component(Q_DIR_CONFIG ${Qt5_DIR} DIRECTORY) 
get_filename_component(Q_DIR_LIB ${Q_DIR_CONFIG} DIRECTORY) 
get_filename_component(Q_DIR_INSTALL ${Q_DIR_LIB} DIRECTORY) 

set(QT_DIR_BIN ${Q_DIR_INSTALL}/bin) 
set(QT_DIR_QML ${Q_DIR_INSTALL}/qml) 
set(INSTALL_QML_DIR ${INSTALL_DIR}/${EXECUTABLE}/Contents/MacOS) 


# setup os x bundle 
# *********************************************************************** 
set(MACOSX_BUNDLE_INFO_STRING ${TEMPLATE_BUNDLE_INFO}) 
set(MACOSX_BUNDLE_BUNDLE_VERSION ${TEMPLATE_BUNDLE_VERSION}) 
set(MACOSX_BUNDLE_LONG_VERSION_STRING  ${TEMPLATE_BUNDLE_VERSION_MAJOR}.${TEMPLATE_BUNDLE_VERSION_MINOR}.${TEMPLATE_ BUNDLE_VERSION_PATCH}) 
set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${TEMPLATE_BUNDLE_VERSION_MAJOR}.${TEMPLATE_BUNDLE_VERSION_MINOR}.${TEMPLATE_ BUNDLE_VERSION_PATCH}) 
set(MACOSX_BUNDLE_COPYRIGHT ${TEMPLATE_BUNDLE_COPYRIGHT}) 
set(MACOSX_BUNDLE_ICON_FILE ${TEMPLATE_NAME}.icns) 
set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.${TEMPLATE_BUNDLE_VENDOR}") 
set(MACOSX_BUNDLE_BUNDLE_NAME ${TEMPLATE_NAME}) 
set(MACOSX_BUNDLE_RESOURCES ${BINARY_DIR}/${EXECUTABLE}/Contents/Resources) 
set(MACOSX_BUNDLE_ICON ${ROOT_DIR}/Resources/icons /${MACOSX_BUNDLE_ICON_FILE}) 


# bundle directories & resources 
# *********************************************************************** 
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory  ${MACOSX_BUNDLE_RESOURCES}) 
#execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different  ${MACOSX_BUNDLE_ICON} ${MACOSX_BUNDLE_RESOURCES}) 

file(GLOB SOURCES 
    src/*.h 
    src/*.cpp 
) 
include_directories(${SOURCES}) 

# add executable 
# *********************************************************************** 
if(APPLE) 
    add_executable(${TEMPLATE_NAME} MACOSX_BUNDLE ${SOURCES}  ${MACOSX_BUNDLE_ICON}) 
endif() 
if(WIN32) 
    add_executable(${TEMPLATE_NAME} ${SOURCES}) # WIN32 
endif() 

target_link_libraries(VisuRysm ${ITK_LIBRARIES} ${OpenCV_LIBS} Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Quick Qt5::Qml Qt5::Concurrent Qt5::PrintSupport Qt5::Multimedia) 

# install 
# *********************************************************************** 
configure_file(${ROOT_DIR}/cmake/PostInstall.in.cmake  ${BINARY_DIR}/PostInstall.cmake) 
install(TARGETS ${TEMPLATE_NAME} BUNDLE DESTINATION . COMPONENT Runtime  RUNTIME DESTINATION bin COMPONENT Runtime) 
install(FILES ${MACOSX_BUNDLE_ICON} DESTINATION "${INSTALL_DIR}/${EXECUTABLE}/Contents/Resources") 
if(WIN32) 
    Set(DEPENDENCIES "${QT_DIR_BIN}/Qt5Core.dll"  "${QT_DIR_BIN}/Qt5Cored.dll" "${QT_DIR_BIN}/Qt5Widgets.dll"  "${QT_DIR_BIN}/Qt5Widgetsd.dll" 
        "${QT_DIR_BIN}/Qt5Gui.dll"  "${QT_DIR_BIN}/Qt5Guid.dll" "${QT_DIR_BIN}/Qt5Quick.dll"  "${QT_DIR_BIN}/Qt5Quickd.dll" 
        "${QT_DIR_BIN}/Qt5Qml.dll"  "${QT_DIR_BIN}/Qt5Qmld.dll" "${QT_DIR_BIN}/QT5Concurrent.dll"  "${QT_DIR_BIN}/QT5Concurrentd.dll" 
        #"${QT_DIR_BIN}/icuin54.dll"  "${QT_DIR_BIN}/icuuc54.dll" "${QT_DIR_BIN}/icudt54.dll" 
        "${QT_DIR_BIN}/QT5Networkd.dll" 
        "${QT_DIR_BIN}/QT5Network.dll"  "${QT_DIR_BIN}/Qt5PrintSupport.dll" "${QT_DIR_BIN}/Qt5PrintSupportd.dll") 
    file(COPY ${DEPENDENCIES} DESTINATION ${BUILD_DIR}) 
    file(COPY ${DEPENDENCIES} DESTINATION ${BINARY_DIR}) 
endif() 
if(TEMPLATE_USE_QT) 
    install(SCRIPT ${BINARY_DIR}/PostInstall.cmake) 
endif() 


# post-build: pack resources 
# *********************************************************************** 
add_custom_command(TARGET ${TEMPLATE_NAME} POST_BUILD COMMAND  ${CMAKE_COMMAND} -E copy_directory ${ROOT_DIR}/Resources  ${BUILD_DIR}/${EXECUTABLE}/Contents/Resources) 
message((STATUS "> postbuild: ${PROJECT_SOURCE_DIR}/Resources} =>  ${BUILD_DIR}/Contents/Resources}")) 

내 C++ 프로그램을 할 수있는 쉬운 방법이 있나요 :

+---build 
| | ALL_BUILD.vcxproj 
| | ... 
| | INSTALL.vcxproj 
| | INSTALL.vcxproj.filters 
| | ... 
| | Qt dlls 
| | ... 
| | VisuRysm.sln 
| | 
| +---cmake 
| |  
| +---CMakeFiles 
| |   
| +---Contents 
| | \---Resources 
| +---Debug 
| +---ITKIOFactoryRegistration 
| |  itkImageIOFactoryRegisterManager.h 
| |  itkTransformIOFactoryRegisterManager.h 
| |  
| +---VisuRysm.dir 
| | \---Debug 
| |  | App.obj 
| |  | AppConfig.obj 
| |  | AppController.obj 
| |  | AppWindow.obj 
| |  | Image.obj 
| |  | ImageProvider.obj 
| |  | main.obj 
| |  | vc120.pdb 
| |  | VideoService.obj 
| |  | VisuRysm.log 
| |  | VisuRysm_automoc.obj 
| |  | ZProjectionService.obj 
| |  | 
| |  \---VisuRysm.tlog 
| |    
| +---VisuRysm_automoc.dir 
| |  
| \---x64 
|  \---Debug 
|   +---ALL_BUILD 
|   | | ALL_BUILD.log 
|   | | 
|   | \---ALL_BUILD.tlog 
|   |   
|   +---INSTALL 
|   | | INSTALL.log 
|   | | 
|   | \---INSTALL.tlog 
|   |   
|   \---ZERO_CHECK 
|    | ZERO_CHECK.log 
|    | 
|    \---ZERO_CHECK.tlog 
|      
\---source 
    | CMakeLists.txt 
    | 
    +---build 
    | | ITKIOBioRad-4.6.dll 
    | | ITKIOBMP-4.6.dll 
    | | ITKIOGIPL-4.6.dll 
    | | ITKIOHDF5-4.6.dll 
    | | QT5Concurrent.dll 
    | | QT5Concurrentd.dll 
    | | Qt5Core.dll 
    | | Qt5Cored.dll 
    | | Qt5Gui.dll 
    | | Qt5Guid.dll 
    | | QT5Network.dll 
    | | QT5Networkd.dll 
    | | Qt5PrintSupport.dll 
    | | Qt5PrintSupportd.dll 
    | | Qt5Qml.dll 
    | | Qt5Qmld.dll 
    | | Qt5Quick.dll 
    | | Qt5Quickd.dll 
    | | Qt5Widgets.dll 
    | | Qt5Widgetsd.dll 
    | | VisuRysm.exe 
    | | VisuRysm.exp 
    | | VisuRysm.ilk 
    | | VisuRysm.lib 
    | | VisuRysm.pdb 
    | | 
    | \---Contents 
    |  \---Resources 
    |   +---fonts 
    |   | +---font-awesome 
    |   | |  fontawesome-webfont.ttf 
    |   | |  
    |   | \---roboto 
    |   |   
    |   +---icons 
    |   | | VisuRysm.icns 
    |   | | 
    |   | +---develop 
    |   | |  Icon.icns 
    |   | |  VisuRysm.icns 
    |   | |  
    |   | \---release 
    |   |   Icon.icns 
    |   |   VisuRysm.icns 
    |   |   
    |   \---qml 
    |    +---App 
    |    |  Magic.qml 
    |    |  Main.qml 
    |    |  
    |    \---Lib 
    |      icon.qml 
    |      icons.js 
    |      label.qml 
    |      qmldir 
    |      Video.qml 
    |      
    +---cmake 
    |  
    +---install 
    | +---bin 
    | | | VisuRysm.exe 
    | | | 
    | | \---Contents 
    | |  \---Resources 
    | |   +---fonts 
    | |   | +---font-awesome 
    | |   | |  fontawesome-webfont.ttf 
    | |   | |  
    | |   | \---roboto 
    | |   |   
    | |   +---icons 
    | |   | | VisuRysm.icns 
    | |   | | 
    | |   | +---develop 
    | |   | |  Icon.icns 
    | |   | |  VisuRysm.icns 
    | |   | |  
    | |   | \---release 
    | |   |   Icon.icns 
    | |   |   VisuRysm.icns 
    | |   |   
    | |   \---qml 
    | |    +---App 
    | |    |  Magic.qml 
    | |    |  Main.qml 
    | |    |  
    | |    \---Lib 
    | |      icon.qml 
    | |      icons.js 
    | |      label.qml 
    | |      qmldir 
    | |      Video.qml 
    | |      
    | \---Contents 
    |    
    +---Resources 
    | +---fonts 
    | | +---font-awesome 
    | | |  fontawesome-webfont.ttf 
    | | |  
    | | \---roboto 
    | |   
    | +---icons 
    | | | VisuRysm.icns 
    | | | 
    | | +---develop 
    | | |  Icon.icns 
    | | |  VisuRysm.icns 
    | | |  
    | | \---release 
    | |   Icon.icns 
    | |   VisuRysm.icns 
    | |   
    | \---qml 
    |  +---App 
    |  |  Magic.qml 
    |  |  Main.qml 
    |  |  
    |  \---Lib 
    |    icon.qml 
    |    icons.js 
    |    label.qml 
    |    qmldir 
    |    Video.qml 
    |    
    \---src 
      App.cpp 
      App.h 
      AppConfig.cpp 
      AppConfig.h 
      AppController.cpp 
      AppController.h 
      AppWindow.cpp 
      AppWindow.h 
      Image.cpp 
      Image.h 
      ImageProvider.cpp 
      ImageProvider.h 
      main.cpp 
      VideoService.cpp 
      VideoService.h 
      ZProjectionService.cpp 
      ZProjectionService.h 

그래서 나는 내용 (QML 물건)와 실제 코드를 내 소스 폴더를하고 난 cmake로 모든 것을 구축 모든 필요한 DLL (ITK, openCV, Qt)을 하나의 exe 파일에 넣으시겠습니까? 그렇다면 어떻게해야합니까? Visual Studio를 통해 방법이 있습니까?

이미 다른 컴퓨터에/source/build -folder (모든 dll, qml-contents 및 exe가 있음)를 복사하려고 시도했습니다. 그러나 여전히 다른 컴퓨터에서 exe를 실행하려면 일부 라이브러리가 없습니다. 폴더에 수동으로 라이브러리를 복사하더라도 여전히 오류가 발생합니다. ITKSmartPointer 오류.

+1

'필요한 모든 DLL (ITK, openCV, Qt)을 모두 하나의 exe 파일에 넣는 쉬운 방법이 있습니까? - 그렇게하려면 ITK, OpenCV, Qt를 빌드해야합니다. ** 정적 라이브러리 **. 정적 라이브러리가 실행 가능 파일로 링크되면 해당 라이브러리의 코드는 실행 가능 파일의 일부가됩니다. '.dll' (공유 라이브러리)를 사용하면이를 구현할 수 없습니다. – Tsyvarev

+0

빠른 답변에 감사드립니다. 나는 그것을하려고 노력했다. 그러나 명백하게 나는 너무나 어리 석다. 이 튜토리얼이나 이것을 달성하는 방법에 대한 저를 가르쳐 주시겠습니까? –

+1

각 프로젝트/프레임 워크에는 정적 라이브러리로 컴파일하는 고유 한 방법이 있습니다. 예 : [해당 질문] (http://stackoverflow.com/questions/7583172/opencv-as-a-static-library-cmake-options)은 정적 라이브러리가 포함 된 QT를 작성하는 것에 대한 것입니다. ITK 및 OpenCV에 대한 유사한 정보를 Google에 제공 할 수 있습니다. – Tsyvarev

답변

1

정적 라이브러리로 ITK 및 OpenCV를 빌드하려면 CMake로 구성 할 때 BUILD_SHARED_LIBS 옵션을 OFF로 설정하십시오. 이렇게하면 실행 파일에 통합 될 정적 라이브러리가 생성되므로 추가 DLL이 필요하지 않습니다.

Qt 라이브러리의 정적 링크에는 다음과 같은 자습서가 있습니다. this.

모든 DLL을 복사하더라도 Visual Studio의 디버그 빌드는 다른 컴퓨터에서 작동하지 않습니다. 릴리스 모드에서 응용 프로그램을 컴파일 한 다음 모든 DLL을 다른 컴퓨터에 복사하십시오.

DLL을 복사하거나 충돌 버전을 PATH에 추가 할 필요가 없으므로 정적 라이브러리를 사용하여 모든 프로젝트를 빌드하는 것이 좋습니다. 유일한 예외는 Qt입니다 - 나는 경로에 최신 버전을 추가합니다.