1. 创建CMakeLists.txt文件
  2. 运行构建
mkdir build
cd build
cmake ..

debug

  • 文件加入set(CMAKE_BUILD_TYPE Debug)
  • 或者 命令行使用cmake -DCMAKE_BUILD_TYPE=Debug .
  • 一旦设置了,除非删除cmake缓存build文件,兜着都是debug模式(缓存原因)

内存泄漏检查sanitize

  1. 在cmake中
dd_compile_options(-fsanitize=address -fsanitize=leak -fsanitize=undefined -fno-omit-frame-pointer)

link_libraries(-fsanitize=address -fsanitize=leak -fsanitize=undefined)

or

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fsanitize=leak -fsanitize=undefined -fno-omit-frame-pointer")
link_libraries(-fsanitize=address -fsanitize=leak -fsanitize=undefined)

  1. 在makefile或者命令行中
g++ -Wall -Werror -std=c++11 -fsanitize=undefined test.cc

选项

#声明要求的cmake最低版本,终端输入cmake -version可查看cmake的版本
cmake_minimum_required( VERSION 2.8 )

#声明cmake工程
project(slam)

# 声明cpp版本
set(CMAKE_CXX_STANDARD 11)

#设置使用g++编译器,这是添加变量的用法set(KEY VALUE)接收两个参数,用来声明变量。在camke语法中使用${KEY}这种写法来取到VALUE
set( CMAKE_CXX_COMPILER "g++")

#设置cmake编译模式有Debug和Release两种PROJECT_SOURCE_DIR项目根目录也就是是CMakeLists.txt的绝对路径
#设置成为debug开启调试
set( CMAKE_BUILD_TYPE "Release" )

#设定生成的可执行二进制文件存放的存放目录,这个永远是相对于本cmakelists的路径
set( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

#设定生成的库文件的存放目录
set( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

#参数CMAKE_CXX_FLAGS含义是: set compiler for c++ language
#添加c++11标准支持,*.CPP文件编译选项,-march=native指定目标程序的cpu架构来进行程序优化
#native就是相当于自检测cpu,-march是gcc优化选项,后面的-O3是用来调节编译时的优化程度的,最高为-O3,最低为-O0即不做优化
#-Ox这个参数只有在CMake -DCMAKE_BUILD_TYPE=release时有效
#因为debug版的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版的不需要调试信息但需要优化
set( CMAKE_CXX_FLAGS “-std=c++11 -march=native -O3”)

#调试手段message打印信息,类似于echo/printf,主要用于查cmake文件的语法错误
set(use_test ${SOURCES_DIRECTORY}/user_accounts.cpp)
message("use_test : ${use_test}")

#在CMakeLists.txt中指定安装位置, 在编译终端指定安装位置:cmake -DCMAKE_INSTALL_PREFIX=/usr ..
set(CMAKE_INSTALL_PREFIX < install_path >)

#增加子文件夹,也就是进入源代码文件夹继续构建
add_subdirectory(${PROJECT_SOURCE_DIR}/src)

#添加依赖,去寻找该库的头文件位置、库文件位置以及库文件名称,并将其设为变量,返回提供给CMakeLists.txt其他部分使用。
#cmake_modules.cmake文件是把CMakeLists.txt里用来寻找特定库的内容分离出来,如果提示没有找到第三方依赖库可以尝试安装或者暴力指定路径
# 寻找OpenCV库
find_package( OpenCV REQUIRED )

#在CMakeLists.txt中使用第三方库的三部曲:find_package、include_directories、target_link_libraries
include_directories(${OpenCV_INCLUDE_DIRS})// 去哪里找头文件
link_directories()// 去哪里找库文件(.so/.lib/.ddl等)
target_link_libraries( ${OpenCV_LIBRARIES})// 需要链接的库文件
message("OpenCV_INCLUDE_DIRS: \n" ${OpenCV_INCLUDE_DIRS})
message("OpenCV_LIBS: \n" ${OpenCV_LIBS})

find_package(Eigen3 REQUIRED)
#假如找不到Eigen3库,我们就设置变量来指定Eigen3的头文件位置
set(Eigen3_DIR /usr/lib/cmake/eigen3/Eigen3Config.cmake)
include_directories(/usr/local/include/eigen3)

#设置静态连接库的选项
target_compile_options(pthread)
target_link_libraries(executable1 library1 library2)
# 链接静态库,上面用于某一个target
link_libraries(-lpthread)



# 添加可执行文件,相当于编译,可以在这里多加几个add_executable,然后指定不同的main文件,生成多个可执行文件
add_executable(obsidian ${DIR_SRCS})

# 搜索目录下的cpp文件
# 发现一个目录(dir)下所有的源代码文件并将列表存储在一个变量(VAR)中,不会递归查找
aux_source_directory(dir DIR_SRCS)

# 递归搜索所有的cpp文件并添加
file(GLOB SOURCE_FILES "${SOURCE_DIR}/*.cpp ${SOURCE_DIR}/*/*.cpp")

# 宏定义
add_definitions(-D_SHARED_LIBRARY_)
remove_definitions(-D_SHARED_LIBRARY_)

# 设定生成的可执行二进制文件存放的存放目录
set(EXECUTABLE_OUTPUT_PATH ../../bin)

分开编译

  • make 编译main.cpp,make local编译local.cpp,EXCLUDE_FROM_ALL 属性用于将 local 目标从默认的构建目标列表中排除,这样在运行 make 时就不会编译 local 目标。
# 设置项目名称和最低版本要求
cmake_minimum_required(VERSION 3.0)
project(YourProjectName)

# 添加可执行目标 main
add_executable(main main.cpp)

# 添加可执行目标 local,并且只在 make local 时编译
add_executable(local local.cpp)
set_target_properties(local PROPERTIES EXCLUDE_FROM_ALL TRUE)

# 如果想为特定目标设置其他编译选项,可以使用 target_compile_options 命令
# target_compile_options(local PRIVATE option1 option2 ...)

# 链接库文件等其他配置...

选项

  • 通过 -D传入的变量优先级比set产生的优先级高

变量

  • CMAKE_CURRENT_SOURCE_DIR 当前cmakelist的目录
  • CMAKE_SOURCE_DIR 根cmakelist的目录

others

windows下和 MinGW

  • cmake运行时候加上 cmake.exe -G "MinGW Makefiles" ., 注意需要将 MinGW 的路径添加到path中

[!tip] 参考 CMake指定MinGW编译器C compiler - 昆山皮皮虾 - 博客园