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}")