VTK(0)---CMake工程

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}")
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值