VTK(0)---CMake工程

2023-11-16

VTK(0)—CMake工程



前言

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") 				#或gcc
    set(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::Network
				      g2o_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") 				#或gcc
    set(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::Network
				      g2o_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}")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VTK(0)---CMake工程 的相关文章

随机推荐

  • <Linux开发>驱动开发 -之-基于pinctrl/gpio子系统的LED驱动

    Linux开发 驱动开发 之 基于pinctrl gpio子系统的LED驱动 交叉编译环境搭建 Linux开发 linux开发工具 之 交叉编译环境搭建 uboot移植可参考以下 Linux开发 之 系统移植 uboot移植过程详细记录 第
  • [633]pyppeteer驱动浏览器

    当使用selenium去某宝或其他网站进行爬虫或者模拟登陆时 会出现滑动验证码 并且无论是用ActionChains滑还是手动滑 都会很委婉的告诉你 哎呀网络错误 请刷新 等等 why 爬虫都会碰到某些网站刚刚打开页面就被判定为 非人类行为
  • [WinError 10061] 由于目标计算机积极拒绝,无法连接。‘))‘: /simple/scikit-learn/

    WinError 10061 由于目标计算机积极拒绝 无法连接 simple scikit learn 康康下面的解决办法吧 首先按键盘快捷方式win R 打开运行输入框 输入regedit命令 会弹出这个页面 按照这个路径找 HKEY C
  • 【华为OD机试】GPU算力 (C++ Python Java)2023 B卷

    题目解析 为了充分发挥GPU算力 需要尽可能多的将任务交给GPU执行 现在有一个任务数组 数组元素表示在这1秒内新增的任务个数且每秒都有新增任务 假设GPU最多一次执行n个任务 一次执行耗时1秒 在保证GPU不空闲情况下 最少需要多长时间执
  • python3(六)监督学习

    监督学习 目录 1 监督学习 2 分类 2 1 人体运动信息评级实例 2 2 基本分类模型 2 3 运动状态程序 3 回归 3 1 线性回归 正文 回到顶部 1 监督学习 利用一组带标签的数据 学习从输入到输出的
  • Xilinx BRAM IP介绍

    BRAM IP核介绍 BRAM简介 BRAM类型 三种读写模式 写优先 读优先 No change 总线支持 输出寄存 BRAM简介 BRAM 即Block RAM 是FPGA中一种重要的存储资源 另一种常见的存储资源是DRAM Distr
  • IDEA 解决项目端口被占用

    1 在Windows Cmd窗口命令下 输入 netstat ano findstr 8080 说明 查看占用8080端口的进程 显示占用端口的进程 2 kill 占用8080 端口进程 taskkill pid 34728 f 说明 运行
  • 小程序获取用户当前位置计算距离最近的地铁站并获取对应地区的商品(可手动切换地铁线路及地铁站)

    功能介绍 主要就是获取到用户当前位置的经纬度 调用后端api接口计算出距离最近的地铁站 并展示对应商家 用户可手动切换或者搜索地铁站点进行切换 切换后展示对应地铁站附近的商家 这里手动切换地铁站是直接用的picker组件对地铁线路以及地铁站
  • 一点绕另一点旋转一定角度后的坐标计算

    假设对坐标系上任意点 x y 绕一个坐标点 rx ry 逆时针旋转 角度后的新的坐标设为 x0 y0 有公式 x0 x rx cos y ry sin rx y0 x rx sin y ry cos ry
  • 2023数学建模思路 - 案例

    更多数学建模案例 https mianbaoduo com o bread YpyXmZhs 一 背景 二 高斯分布的指数族形式 三 对数配分函数与充分统计量的关系 三 极大似然估计与充分统计量 lt
  • ppt转换成pdf免费软件

    为什么80 的码农都做不了架构师 gt gt gt ppt转换成pdf免费软件 导读 使用 ppt转换成pdf转换器当然是转换ppt文件的一个方法 但毕竟好的转换工具并不多 对于从事大量文案处理的工作人员来讲 没有一款专业好用的ppt转换成
  • Linux下使用鼠标滚轮

    Linux下使用鼠标滚轮 让acrobat pdfreader支持滚轮鼠标 这些天用acroread看pdf文件 发现不支持鼠标滚轮 很不爽 最终在水母上搜到了解决方法 将如下内容加到 Xresources文件中 AcroRead XmSc
  • 方差、标准差、协方差、协方差矩阵、散度矩阵

    方差 统计中的方差 样本方差 是每个样本值与全体样本值的平均数之差的平方值的平均数 概率论中方差用来度量随机变量和其数学期望 即均值 之间的偏离程度 1 统计 方差用来计算每一个变量 观察值 与总体均数之间的差异 为避免出现离均差总和为零
  • 小程序实现滚动加载(懒加载)

    前言 小程序是一项很受欢迎的技术 随着其能力的不断增强 越来越多的人开始使用小程序来完成各种任务 当我面面临一个页面有非常多的数据时 该如何处理呢 显然一次性全部加载完 会非常消耗性能的 为了解决这些问题从而出现了一种叫滚动加载的数据处理方
  • 数字时钟仿真电路设计

    课题设计要求 时间以24小时为一个周期 显示时 分 秒 具有校时功能 可以分别对时分秒进行单独校时 使其校正到标准时间 计时过程具有报时功能 当时间到达整点前十秒进行蜂鸣报时 为了保证计时的稳定及准确 须由晶体振荡器提供表针时间基准信号 准
  • 微信公众号开发config:fail,Error: invalid url domain总结自己遇到的几种原因

    1 JS接口安全域名配置错误 不要http 2 设置安全域名时 txt文件未在域名根目录下 3 appid错误 用了其他公众号的 4 ios手机 获取的当前url与实际不一致 详情见下一篇文章
  • Gradle版本7+ AAR包的引入应用

    ARR包的使用 作为一个安卓的初学者 因为某些个客户需要我们提供安卓SDK 我们压根没有移动端业务 为了赚钱 硬着头皮从0开始写一个SDK 终于我这个 百度战士 也靠百度打出了aar包 问题来了 当你搜索安卓如何引用aar 包的时候 是不是
  • Unity物体拖拽系统(一)

    在游戏制作的过程中 我们经常会遇到拖拽物体到某个位置并做其他操作的需求 比如我们会把装备拖动到装备栏来使用这个装备 为了方便的解决这个问题 我制作了一套耦合性比较低的拖拽系统 这套拖拽会适配我们之前制作的按键系统 很简单的就可以添加上手柄的
  • 哈希表查找失败的平均查找长度_哈希算法高大上?也不过如此

    01 知识框架 02 知识点详解 1 散列表的相关概念 什么是散列表和散列函数 是根据关键码值 Key value 而直接进行访问的数据结构 也就是说 它通过把关键码值映射到表中一个位置来访问记录 以加快查找的速度 这个映射函数叫做 散列函
  • VTK(0)---CMake工程

    VTK 0 CMake工程 目录 前言 一 指定cmake版本 二 设置工程 三 针对Qt 自动使用moc uic rcc程序预处理 h文件 ui文件等 四 平台移植问题 五 设置编译模式 六 找到包 七 包含头文件等 八 链接库文件 九