linux环境下打包c++的Qt应用程序装载vtk和itk(cmake方式)


一、QT安装

安装参考

二、VTK安装

安装参考

三、ITK安装

安装参考

四、cmake构建

4.1 cmake简介

CMake是一个跨平台的建构系统的工具,可以用简单的语句来描述所有平台的安装(编译过程)。(具体学习可以参考其他文章)

4.2 编写CMakeLists.txt

项目名称:test
在项目目录下创建CMakeLists.txt并编写

4.2.1 CMakeLists.txt详细版

cmake_minimum_required(VERSION 3.5)
project(test)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_AUTOMOC on)
set(CMAKE_AUTOUIC on)
set(CMAKE_AUTORCC on)
set(CMAKE_BUILD_TYPE Release)
# project_name
set(PROJECT_NAME test)

# qt 
# 设置qt的安装目录下的cmake路径,此处由于后面把项目test容器化 所以本人将qt安装信息拷贝到test的同级目录
set(Qt6_Cmake ../base/qt/lib/cmake)
set(Qt6_DIR ${Qt6_Cmake}/Qt6)
set(Qt6Core_DIR ${Qt6_Cmake}/Qt6Core)
set(Qt6Gui_DIR ${Qt6_Cmake}/Qt6Gui)
#set(Qt6Widgets_DIR ${Qt6_Cmake}/Qt6Widgets)
set(Qt6Network_DIR ${Qt6_Cmake}/Qt6Network)
set(Qt6Qml_DIR ${Qt6_Cmake}/Qt6Qml)
set(Qt6WebSockets_DIR ${Qt6_Cmake}/Qt6WebSockets)
#set(Qt6Quick_DIR ${Qt6_Cmake}/Qt6Quick)
# 具体需要qt的包根据情况添加或删除
find_package(Qt6 COMPONENTS Core Gui Qml Network WebSockets REQUIRED)

# vtk
# 设置vtk的动态链接库的地址,同上由于后面把项目test容器化 所以将vtk动态链接库信息拷贝到test的同级目录
LINK_DIRECTORIES(../base/vtk/lib)
# 此处链接库的信息不是全部,具体可根据项目情况添加或删除
set(VTKlibs
        -lvtkCommonCore-9.2
        -lvtkCommonDataModel-9.2
        -lvtkCommonExecutionModel-9.2
        -lvtkCommonMath-9.2
        -lvtkCommonTransforms-9.2
        -lvtkImagingCore-9.2
        -lvtkImagingGeneral-9.2
        -lvtkInteractionImage-9.2
        -lvtkIOImage-9.2
        -lvtkRenderingCore-9.2
        -lvtksys-9.2
        -lvtkloguru-9.2
        -lvtkCommonMisc-9.2
        -lvtkCommonSystem-9.2
        -lvtkpugixml-9.2
        -lvtkkissfft-9.2
        -lvtkImagingSources-9.2
        -lvtkInteractionWidgets-9.2
        -lvtkInteractionStyle-9.2
        -lvtkImagingColor-9.2
        -lvtkDICOMParser-9.2
        -lvtkmetaio-9.2
        -lvtktiff-9.2
        -lvtkzlib-9.2
        -lvtkjpeg-9.2
        -lvtkCommonColor-9.2
        -lvtkFiltersGeometry-9.2
        -lvtkFiltersSources-9.2
        -lvtkFiltersGeneral-9.2
        -lvtkFiltersCore-9.2
        -lvtkCommonComputationalGeometry-9.2
        -lvtkRenderingContext2D-9.2
        -lvtkFiltersHybrid-9.2
        -lvtkFiltersModeling-9.2
        -lvtkFiltersTexture-9.2
        -lvtkRenderingAnnotation-9.2
        -lvtkRenderingFreeType-9.2
        -lvtkfmt-9.2
        -lvtkfreetype-9.2
        -lvtkpng-9.2
        )
# itk
# 设置itk的动态链接库的地址,同上由于后面把项目test容器化 所以将itk动态链接库信息拷贝到test的同级目录
LINK_DIRECTORIES(../base/itk/lib)
# 此处链接库的信息不是全部,具体可根据项目情况添加或删除
set(ITKlibs
        -lITKCommon-5.2
        -lITKIOImageBase-5.2
        -lITKIOGDCM-5.2
        -lITKVTK-5.2
        -lITKEXPAT-5.2
        -litksys-5.2
        -litkvnl-5.2
        -litkdouble-conversion-5.2
        -litkgdcmMSFF-5.2
        -litkgdcmDICT-5.2
        -litkgdcmDSED-5.2
        -litkv3p_netlib-5.2
        -litkgdcmjpeg8-5.2
        -litkgdcmjpeg12-5.2
        -litkgdcmjpeg16-5.2
        -litkgdcmopenjp2-5.2
        -litkgdcmcharls-5.2
        -litkgdcmuuid-5.2
        -litkgdcmIOD-5.2
        -litkgdcmCommon-5.2
        -litkzlib-5.2
        -litkvnl_algo-5.2
        )

# header
# 此处引入当前项目(test)工程目录下的头文件 没有则不需要 有则根据需要添加或删除
set(HEADERS
        include/a1.h
        include/a2.h
        include/a3.h
 )
# sources
# 此处引入当前项目(test)工程目录下的源文件 没有则不需要 有则根据需要添加或删除
set(SOURCES
        main.cpp
        a1.cpp
        a2.cpp
        a3.cpp
        )
# resources
# 此处引入当前项目(test)工程目录下的资源文件 没有则不需要 有则根据需要添加或删除
set(RESOURCES
        qml.qrc
        main.qml
    )
# 引入其它头文件(可包含项目本身或动态链接库的同文件) 
INCLUDE_DIRECTORIES(
        .
        ../base/qt/include
        ../base/qt/include/QtNetwork
        ../base/qt/include/QtCore
        ../base/qt/include/QtQml
        ../base/vtk/include/vtk-9.2
        ../base/itk/include/itk-5.2
        ../base/itk/vtkGlueInclude
        )

add_executable(${PROJECT_NAME} ${HEADERS} ${SOURCES} ${RESOURCES})
# 引入自定义VTK的动态链接库
target_link_libraries(${PROJECT_NAME} ${VTKlibs})
# 引入自定义ITK的动态链接库
target_link_libraries(${PROJECT_NAME} ${ITKlibs})
# 引入自定义Qt的动态链接库
target_link_libraries(${PROJECT_NAME} Qt6::Core Qt6::Gui Qt6::Qml Qt6::Network Qt6::WebSockets)

4.2.2 CMakeLists.txt简单版

cmake_minimum_required(VERSION 3.5)
project(test)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_AUTOMOC on)
set(CMAKE_AUTOUIC on)
set(CMAKE_AUTORCC on)
set(CMAKE_BUILD_TYPE Release)
# project_name
set(PROJECT_NAME test)

find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
find_package(VTK REQUIRED)
find_package(ITK REQUIRED)

include_directories(${ITK_INCLUDE_DIRS} ${VTK_INCLUDE_DIRS})

target_link_libraries(${PROJECT_NAME} ${ITK_LIBRARIES} ${VTK_LIBRARIES} Qt5::Core Qt5::Widgets)

4.3 编译打包

在test目录下新建build目录并进入build目录下执行:
sudo cmake ..
再执行
sudo make -j
后查看当前目录下文件发现test.sh文件则构建完成
执行:sudo ./test
创建日志文件: sudo touch info.log
后台执行: sudo nohup ./test > info.log 2>&1 &

五、容器化

5.1 编辑Dockerfile

在test同级目录创建并编写Dockerfile文件:

# FROM ubuntu
FROM amd64/ubuntu:latest
MAINTAINER chenwei <chenwei@163.com>
RUN apt-get update && apt-get install -y vim
# 当前项目test的目录进行同步映射
WORKDIR /usr/local/projects/test/build
# 拷贝当前项目
COPY ./test/ /usr/local/projects/test/
# 拷贝itk的动态链接库
COPY ./base/itk/lib/* /usr/lib/
# 拷贝vtk的动态链接库
COPY ./base/vtk/lib/* /usr/lib/
# 拷贝qt的动态链接库
COPY ./base/qt/renderLib/* /usr/lib/
# 拷贝其它的动态链接库 具体根据情况添加或删除
COPY ./base/otherlib/* /usr/lib/
CMD ./test && tail -f info.log
# CMD sh -c "touch ../config.json && echo '{\"hostIp\":\"'${hostIp}'\",\"servicePort\":'${servicePort}'}' > ../config.json && ./test && tail -f info.log"
# 项目本身容器内暴漏的端口
EXPOSE 8060

5.2 打包运行

打包成镜像:

docker build -t test:base .

运行并进入容器内:

sudo docker run -it --name test1 -p 8893:8893 test:base /bin/bash

后台运行:

sudo docker run --privileged=true --restart=always -itd --name test1 -p 8060:8060 test:base

版权声明:本文为CEVERY原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。