VTK(0)—CMake工程


目录

  • 前言
  • 一、指定cmake版本
  • 二、设置工程
  • 三、针对Qt,自动使用moc、uic、rcc程序预处理.h文件、ui文件等
  • 四、平台移植问题
  • 五、设置编译模式
  • 六、找到包
  • 七、包含头文件等
  • 八、链接库文件
  • 九、生成可执行文件或静态链接库
  • 完整示例

前言

cmake是一个跨平台的工程构建工具,cmake可以在linux或者windows等平台使用,管理大型的工程。使用cmake可以简化构建过程,在工程的目录中写一个CMakeLists.txt文件,就可以通过cmake来编译文件。cmake有自己的语法规则,原则上每个工程里面都会包含相同文件名的脚本文件CMakeLists.txt,在构建工程时,尽量使用这个文件名(CMakeLists.txt)。
其中,cmake中最重要的有四个步骤:找到包、头文件、链接库、编译生成可执行程序。


一、指定cmake版本

cmake_minimum_required(VERSION 2.8)

二、设置工程

project(project_name) #project_name可以根据自己的工程来指定

三、针对Qt,自动使用moc、uic、rcc程序预处理.h文件、ui文件等

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

如果源码和头文件分开放在不同文件,那么需要单独指定预处理的位置和文件:

FILE(GLOB sourceFile ${CMAKE_CURRENT_SOURCE_DIR}/source/**)
FILE(GLOB incFile ${CMAKE_CURRENT_SOURCE_DIR}/include/**)
QT5_WRAP_CPP(wrapcpp ${incFile})

四、平台移植问题

根据不同的平台设置不同的编译器gcc、clang、或者添加nvcc编译器等

IF(CMAKE_SYSTEM_NAME MATCHES "Windows")set(CMAKE_C_COMPILER "clang")link_libraries(ws2_32 wsock32)             #使用windows下的套接字需要此行代码
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Linux")set(CMAKE_C_COMPILER "clang")              #或gccset(CMAKE_CXX_COMPILER "clang++")          #或g++set(CMAKE_CXX_FLAGS "-std=c++11 -O3 -Wall") #c++11标准、O3编译优化、显示所有(warning all)编译过程警告
ENDIF()

五、设置编译模式

set(CMAKE_BUILD_TYPE "Release")  #或者Debug

六、找到包

例如找到OpenCV、Qt5、VTK等库,利用find_package关键字

find_package(OpenCV 4.3.0  REQUIRED)                             #指定包的版本
find_package(Qt5 COMPONENTS Widgets Core Gui Network REQUIRED)  #指定包的模块
find_package(VTK REQUIRED)
find_package(Boost REQUIRED)
find_package(G2O REQUIRED)
find_package(PCL REQUIRED)
find_package(Pangolin REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(Sophus REQUIRED)

七、包含头文件等

对于vtk:

include(${VTK_USE_FILE})

添加资源目录:

set(CMAKE_INCLUDE_CURRENT_DIR ON)

第二条语句是自动添加CMAKE_CURRENT_BINARY_DIR(工程编译目录)CMAKE_CURRENT_SOURCE_DIR(当前处理的CMakeLists.txt所在的路径)到当前处理的CMakeLists.txt,相当于在每个CMakeLists.txt加入:INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

一般头文件包含:

INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}   #PROJECT_SOURCE_DIR一般来说是源码文件路径,暂且认为是和CMakeLists.txt目录相同,实际上有些区别${PROJECT_SOURCE_DIR}/include${Pangolin_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}${Boost_INCLUDE_DIRS}${EIGEN3_INCLUDE_DIRS}${Sophus_INCLUDE_DIRS})

八、链接库文件

动态链接库或静态链接库的搜索路径,相当于gcc的-L参数:

LINK_DIRECTORIES(${PCL_LIBRARY__DIRS} ${VTK_LIBRARY_DIRS}) #等等,目录也可以自己定义,例如${PROJECT_SOURCE_DIR}/lib

添加链接库,相同于指定-l参数:例如添加Opencv,vtk,Qt5等

TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${VTK_LIBRARIES} ${OpenCV_LIBS} ${Pangolin_LIBRARIES}${Sophus_LIBRARIES}${Boost_LIBRARIES}Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Networkg2o_core g2o_csparse_extension g2o_types_sim3 g2o_stuff g2o_types_sba)

九、生成可执行文件或静态链接库

利用ADD_EXECUTABLE或者ADD_LIBRARY关键字:

ADD_EXECUTABLE(${PROJECT_NAME} main.cpp A.cpp B.cpp ...)
ADD_LIBRARY(${PROJECT_NAME} main.cpp A.cpp B.cpp ...)

或者设置一个变量用来存放源文件:

set(SOURCE main.cpp A.cpp B.cpp ...)
add_executable(${PROJECT_NAME} ${SOURCE})

利用以下方式可以自动搜索路径下的所有源文件.cpp

AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR} SRC_LIST)    #或者${CMAKE_CURRENT_SOURCE_DIR}和.都可以
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})
#ADD_LIBRARY(${PROJECT_NAME} ${SRC_LIST})

完整示例

CMakeLists.txt简单示例

#1.cmake版本
cmake_minimum_required(VERSION 2.8)#2.指定工程
project(vtk_medical_3d)#3.针对Qt的自动预处理
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)#4.跨平台
IF(CMAKE_SYSTEM_NAME MATCHES "Windows")set(CMAKE_C_COMPILER "clang")link_libraries(ws2_32 wsock32)             #使用windows下的套接字需要此行代码
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Linux")set(CMAKE_C_COMPILER "clang")              #或gccset(CMAKE_CXX_COMPILER "clang++")          #或g++set(CMAKE_CXX_FLAGS "-std=c++11 -O3 -Wall") #c++11标准、O3编译优化、显示所有(warning all)编译过程警告
ENDIF()#5.编译模式
set(CMAKE_BUILD_TYPE "Release")#6.找到包
# PCL
find_package(PCL REQUIRED)
add_definitions(${PCL_DEFINITIONS})
# Qt5
find_package(Qt5 COMPONENTS Widgets Core Gui Network REQUIRED)
# OpenCV
find_package( OpenCV 4.3.0 REQUIRED)
# Eigen3
find_package( Eigen3 REQUIRED )
# G2O
find_package( G2O REQUIRED )
# Pangoling
find_package( Pangolin REQUIRED)
# Sophus
find_package( Sophus REQUIRED)
# Boost
find_package( Boost REQUIRED)#7.头文件
include(${VTK_USE_FILE})                                        #针对VTK
set(CMAKE_INCLUDE_CURRENT_DIR ON)                               #相当于
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})     INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}                      #源码所在位置或CMakeLists所在位置${Pangolin_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}${PCL_INCLUDE_DIRS}${BOOST_INCLUDE_DIRS}${EIGEN3_INCLUDE_DIRS}${Sophus_INCLUDE_DIRS})  #8.链接库
#link_directories(${VTK_LIBRARY_DIRS})
TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${VTK_LIBRARIES} ${OpenCV_LIBS} ${Pangolin_LIBRARIES}${Boost_LIBRARIES}${Sophus_LIBRARIES}${PCL_LIBRARIES}Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Networkg2o_core g2o_csparse_extension g2o_types_sim3 g2o_stuff g2o_types_sba )#9.生成可执行文件或静态链接库#手动设置指定源文件
#set(SOURCE main.cpp)
#add_executable(${PROJECT_NAME} ${SOURCE})
#add_library(${PROJECT_NAME} ${SOURCE})#自动获取源文件
AUX_SOURCE_DIRECTORY(${PROJECT_SOURCE_DIR} SRC_LIST)
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC_LIST})
#ADD_LIBRARY(${PROJECT_NAME} ${SRC_LIST})#10.打印信息
message(STATUS "the sources : ${SRC_LIST}")
message(STATUS "the VTK is : ${VTK_INCLUDE_DIRS}")
message(STATUS "the OpenCV is : ${OpenCV_INCLUDE_DIRS}")

VTK(0)---CMake工程相关推荐

  1. 初识CMake,如何编写一个CMake工程(上)

    如何编写一个CMake工程 笔者想分享CMake工程的原因? 1 接触CMake 1.1 认识CMake被广泛的使用? 1.2 了解CMake运行流程 1.3 Make和Makefile是什么关系? ...

  2. cmake的使用--从零建立一个小cmake工程

    A minimal project 代码仓库地址 https://github.com/zzu-andrew/linux-sys/tree/dfew/CMake # 说明最低cmake版本要求 cma ...

  3. 初识CMake,如何编写一个CMake工程(下)

    如何编写一个CMake工程 上文分析了针对一个源文件.多个源文件.多个目录的情况 1 CMake自定义编译选项Demo4 1.1 效果展示 2 CMake安装(make install)与测试(mak ...

  4. Ubuntu下使用VS Code构建CMake工程

    1.下载Visual Studio Code 编译器 可以去Ubuntu自带的应用商店下载,或者使用你命令行下载 2.设置中文显示 直接下载的是英文版本,需要设置成中文显示 先去VS Code自带的商 ...

  5. Hi3516DV300 Cmake工程建立教程

    Hi3516DV300 Cmake工程建立教程 一.准备事项 二.建立基本的Cmake工程 三.提取SDK完善Cmake工程 四.编译与调试 五.总结 一.准备事项 1.以默认路径安装交叉编译器arm ...

  6. 【Qt】QtCreator导入cmake工程

    QtCreator导入cmake 一.ubuntu系统 1.配置cmake编译套件 2.导入cmake工程 二.windows系统 1.下载cmake 2.安装cmake 3.设置环境变量 4.添加c ...

  7. opencv3.2.0 Cmake 3.8.0 + tdm-gcc-5.1.0-3 编译问题 highgui _Win32_IE

    opencv3.2.0 Cmake 3.8.0 TDM-GCC 5.1.0 Windows 7 遇到如下错误 [ 53%] Building CXX object modules/world/CMak ...

  8. “智慧机场3.0”样板工程 北京大兴机场物联网系统有多牛?

    9月25日,备受瞩目的北京大兴国际机场正式投入运营,凤凰展翅,振翅高飞! 作为民航局打造的"智慧机场3.0"样板工程,北京大兴国际机场利用物联网技术.云计算及存储.个人智能终端.虚 ...

  9. Linux下CMake工程中gtestgmock的安装与使用

    Linux下CMake工程中gtest&gmock的安装与使用 gtest和gmock是什么和功能以及用法可参考以下两篇文章,都相当给力! gtest <玩转Google开源C++单元测 ...

  10. visualGDB下导入cmake工程

    新建工程 创建工程所在目录,给工程起名字 导入cmake工程 配置linux(Ubuntu为例)主机环境 选择源文件目录, 让源代码存在windows电脑下 导入工程完成---点击finish完成,编 ...

最新文章

  1. Java Code Geeks和Packt提供的Hadoop书籍赠品
  2. node.js详解Http服务器
  3. IBM Storwize V7000详解:IIS西安大会现场观察
  4. textedit实时显示位置_加什么地形就看什么等高线!等高线实时预览就是这么爽...
  5. MySQL 字段类型解析
  6. 【渝粤教育】国家开放大学2018年春季 0408-21T管理学基础 参考试题
  7. 小程序普通二维码配置
  8. 斐波那契数列——O(1)算法
  9. Java完全自学手册,从外包到大厂,再到万粉博主都靠它
  10. tkinter 界面设计工具
  11. 宅急送BOS系统软硬件集成方案goldengate(一)
  12. Fresher玩深沉
  13. Help library 安装arcobjects for .NET异常问题
  14. react起步,冲冲冲
  15. 2021-09-28 网安实验-取证分析-Pcap流量包取证
  16. 爬虫报错requests.exceptions.ProxyError:/Failed to establish a new connection: [WinError 10061]
  17. 服务器查看文件口令,查看服务器序列号命令
  18. Warning: Failed to parse host xx.xx.com
  19. Java 基础算法 短板问题 : 你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer, 你必须正好使用 k 块
  20. MARA常规物料数据

热门文章

  1. python处理csv文件计算均值_PYTHON实现对CSV文件多维不同单位数据的归一化处理
  2. spring boot默认扫描的路径
  3. 外包以小时计算金额的费用_全了!各大税种的计算公式,建议收藏!
  4. 试验笔记 - 使用7-ZIP压缩来减小APK安装包体积
  5. tornado(五)
  6. Java之品优购部署_day02(2)
  7. 前端每日实战:76# 视频演示如何用纯 CSS 创作一组单元素办公用品(内含2个视频)...
  8. 分布式锁的原理和实现详解
  9. Java多线程编程那些事:volatile解惑
  10. 华为交换机查看发光收光