- 创建
CMakeLists.txt
文件 - 运行构建
mkdir build
cd build
cmake ..
debug
- 文件加入
set(CMAKE_BUILD_TYPE Debug)
- 或者 命令行使用
cmake -DCMAKE_BUILD_TYPE=Debug .
- 一旦设置了,除非删除cmake缓存build文件,兜着都是debug模式(缓存原因)
内存泄漏检查sanitize
- 在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)
- 在makefile或者命令行中
g++ -Wall -Werror -std=c++11 -fsanitize=undefined test.cc
- 参考github
选项
#声明要求的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 - 昆山皮皮虾 - 博客园