本文仅作为个人的学习记录
1.Cmake学习记录
1.搜索文件
aux_source_directory(< dir > < variable >)
dir:要搜索的目录
variable:存储dir目录
cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
add_executable(app ${SRC_LIST})
file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
GLOB: 将指定目录下搜索到的满足条件的所有文件名生成一个列表,并将其存储到变量中。
GLOB_RECURSE:递归搜索指定目录,将搜索到的满足条件的文件名生成一个列表,并将其存储到变量中。
示例:
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
file(GLOB MAIN_HEAD ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h)
2.包含头文件
include_directories(headpath)
()中指定头文件路径即可
3.包含库文件
链接静态库的命令如下:
link_libraries(<static lib> [<static lib>...])
指定第三方静态库路径:
link_directories(<lib path>)
示例:
cmake_minimum_required(VERSION 3.0)
project(CALC)
# 搜索指定目录下源文件
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
# 包含头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 包含静态库路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 链接静态库
link_libraries(calc)
add_executable(app ${SRC_LIST})
来源: 爱编程的大丙 链接: https://subingwen.cn/cmake/CMake-primer/
4.总结通用模板
# cmake_minimum_required
# project()
# include_directories() 引入头文件
# link_libraries() 链接静态库文件
# add_executable() 生成可执行程序 or add_library() 生成库文件
# target_link_libraries() 链接动态库文件(也可链接静态库)
2.项目示例
简介:实现点云配准算法继承与验证Demo,需要使用到QT VTK PCL库,通过cmake实现子目录划分。将主界面函数设置为生成可执行文件,通过调用各类算法的静态库文件,实现点云导入、配准和可视化。
目录文件树
Project/
├── CMakeLists.txt
├── MainWindow/
│ ├── CMakeLists.txt
│ ├── MainWindow.h
│ ├── MainWindow.cpp
│ ├── MainWindow.ui
│ ├── MainWindow.qrc
│ └── main.cpp
├── ICP/
│ ├── CMakeLists.txt
│ ├── ICP.h
│ └── ICP.cpp
├── PlaneICP/
│ ├── CMakeLists.txt
│ ├── PlaneICP.h
│ └── PlaneICP.cpp
├── MyAlgorithm/
│ ├── CMakeLists.txt
│ ├── MyAlgorithm.h
│ └── MyAlgorithm.cpp
source下CMakeLists
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(RegistrationDemo)
#设置工程包含当前目录,包含头文件
set(cmake_include_current_dir on)
add_subdirectory(MainWindow)
add_subdirectory(PlaneICP)
MainWindow下CMakeLists
cmake_minimum_required(VERSION 3.10.0)
project(MainWindow)
#--------------------------QT--------------------------
set(Qt5_DIR E:/Qt/Qt5.9.4/5.9.4/msvc2017_64/lib/cmake/Qt5)
find_package(Qt5 COMPONENTS Core Gui Widgets REQUIRED)
SET(CMAKE_AUTOMOC ON)
SET(CMAKE_AUTOUIC ON)
SET(CMAKE_AUTORCC ON)
#由于采用set(CMAKE_AUTOUIC ON)的方式处理ui文件,编译时会报错找不到ui文件。
#需要将ui文件夹加入AUTOUIC的搜索目录,这样AUTOUIC处理时才能找到ui文件。
set(CMAKE_AUTOUIC_SEARCH_PATHS ${CMAKE_SOURCE_DIR}/ui)
#--------------------------VTK--------------------------
find_package(VTK REQUIRED)
include_directories(${VTK_INCLUDE_DIRS})
#----------------------------------------------------
link_libraries(${VTK_DIR}/bin/Debug PlaneICP)
include_directories(${CMAKE_SOURCE_DIR}/PlaneICP)
add_executable(MainWindow
main.cpp
MainWindow.cpp
MainWindow.h
MainWindow.ui
MainWindow.qrc
)
target_link_libraries(MainWindow Qt5::Core Qt5::Gui Qt5::Widgets ${VTK_LIBRARIES} ${QT_LIBRARIES})
Plane ICP下CMakeLists
cmake_minimum_required(VERSION 3.10.0)
project(PlaneICP)
#--------------------------PCL--------------------------
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
aux_source_directory(./ SRC)
add_library(PlaneICP ${SRC})
target_link_libraries (PlaneICP ${PCL_LIBRARIES})
3.待解决问题
需要在VS属性页环境变量处添加VTK dll文件目录
待实现的解决方案:
在vs mainwindow项目生成前事件添加命令行,调用copydll.cmake,将VTK dll文件目录复制到exe文件对应目录下。