VTK(0)---CMake工程
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工程相关推荐
- 初识CMake,如何编写一个CMake工程(上)
如何编写一个CMake工程 笔者想分享CMake工程的原因? 1 接触CMake 1.1 认识CMake被广泛的使用? 1.2 了解CMake运行流程 1.3 Make和Makefile是什么关系? ...
- cmake的使用--从零建立一个小cmake工程
A minimal project 代码仓库地址 https://github.com/zzu-andrew/linux-sys/tree/dfew/CMake # 说明最低cmake版本要求 cma ...
- 初识CMake,如何编写一个CMake工程(下)
如何编写一个CMake工程 上文分析了针对一个源文件.多个源文件.多个目录的情况 1 CMake自定义编译选项Demo4 1.1 效果展示 2 CMake安装(make install)与测试(mak ...
- Ubuntu下使用VS Code构建CMake工程
1.下载Visual Studio Code 编译器 可以去Ubuntu自带的应用商店下载,或者使用你命令行下载 2.设置中文显示 直接下载的是英文版本,需要设置成中文显示 先去VS Code自带的商 ...
- Hi3516DV300 Cmake工程建立教程
Hi3516DV300 Cmake工程建立教程 一.准备事项 二.建立基本的Cmake工程 三.提取SDK完善Cmake工程 四.编译与调试 五.总结 一.准备事项 1.以默认路径安装交叉编译器arm ...
- 【Qt】QtCreator导入cmake工程
QtCreator导入cmake 一.ubuntu系统 1.配置cmake编译套件 2.导入cmake工程 二.windows系统 1.下载cmake 2.安装cmake 3.设置环境变量 4.添加c ...
- 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 ...
- “智慧机场3.0”样板工程 北京大兴机场物联网系统有多牛?
9月25日,备受瞩目的北京大兴国际机场正式投入运营,凤凰展翅,振翅高飞! 作为民航局打造的"智慧机场3.0"样板工程,北京大兴国际机场利用物联网技术.云计算及存储.个人智能终端.虚 ...
- Linux下CMake工程中gtestgmock的安装与使用
Linux下CMake工程中gtest&gmock的安装与使用 gtest和gmock是什么和功能以及用法可参考以下两篇文章,都相当给力! gtest <玩转Google开源C++单元测 ...
- visualGDB下导入cmake工程
新建工程 创建工程所在目录,给工程起名字 导入cmake工程 配置linux(Ubuntu为例)主机环境 选择源文件目录, 让源代码存在windows电脑下 导入工程完成---点击finish完成,编 ...
最新文章
- Java Code Geeks和Packt提供的Hadoop书籍赠品
- node.js详解Http服务器
- IBM Storwize V7000详解:IIS西安大会现场观察
- textedit实时显示位置_加什么地形就看什么等高线!等高线实时预览就是这么爽...
- MySQL 字段类型解析
- 【渝粤教育】国家开放大学2018年春季 0408-21T管理学基础 参考试题
- 小程序普通二维码配置
- 斐波那契数列——O(1)算法
- Java完全自学手册,从外包到大厂,再到万粉博主都靠它
- tkinter 界面设计工具
- 宅急送BOS系统软硬件集成方案goldengate(一)
- Fresher玩深沉
- Help library 安装arcobjects for .NET异常问题
- react起步,冲冲冲
- 2021-09-28 网安实验-取证分析-Pcap流量包取证
- 爬虫报错requests.exceptions.ProxyError:/Failed to establish a new connection: [WinError 10061]
- 服务器查看文件口令,查看服务器序列号命令
- Warning: Failed to parse host xx.xx.com
- Java 基础算法 短板问题 : 你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer, 你必须正好使用 k 块
- MARA常规物料数据