저는 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 오류.
'필요한 모든 DLL (ITK, openCV, Qt)을 모두 하나의 exe 파일에 넣는 쉬운 방법이 있습니까? - 그렇게하려면 ITK, OpenCV, Qt를 빌드해야합니다. ** 정적 라이브러리 **. 정적 라이브러리가 실행 가능 파일로 링크되면 해당 라이브러리의 코드는 실행 가능 파일의 일부가됩니다. '.dll' (공유 라이브러리)를 사용하면이를 구현할 수 없습니다. – Tsyvarev
빠른 답변에 감사드립니다. 나는 그것을하려고 노력했다. 그러나 명백하게 나는 너무나 어리 석다. 이 튜토리얼이나 이것을 달성하는 방법에 대한 저를 가르쳐 주시겠습니까? –
각 프로젝트/프레임 워크에는 정적 라이브러리로 컴파일하는 고유 한 방법이 있습니다. 예 : [해당 질문] (http://stackoverflow.com/questions/7583172/opencv-as-a-static-library-cmake-options)은 정적 라이브러리가 포함 된 QT를 작성하는 것에 대한 것입니다. ITK 및 OpenCV에 대한 유사한 정보를 Google에 제공 할 수 있습니다. – Tsyvarev