cmake是用于构建、测试和软件打包的开源跨平台工具
linux下源码编译安装cmake:
./configure
生成makefile文件,make
编译make install
安装编译好的cmakecmake -S . -B build
执行cmake进行编译;直接cmake .
所产生的文件会在当前目录下,过于杂乱,会污染项目源码
-S .
在当前目录下查找CMakeLists.txt并执行;
-B build
构建生成的路径,存放cmake时生成的临时文件,项目文件,包括编译的中间文件、输出文件;
-G "NMake Makefiles"
指定编译器
也可以直接手动创建目录,在该目录下cmake ..
cmake --build build
cmake统一的编译方法,build:编译的项目文件路径
cmake --build build --config Release
--config,配置项,指定Debug或Release,默认是Debug
cmake -install build
对cmake所涉及到的文件(做好的cmake文件,可以直接使用的,如查找库)进行安装,build:项目文件所在的路径
指定最低版本要求
cmake_minimum_required(VERSION 2.8)
构建项目名称
project(smartswitch)//工程名smartswitch
生成可执行程序
add_executable(main main.c ${SRC_LIST})//参数:生成的可执行程序名、所依赖的文件名
向当前工程添加存放源文件的子目录,并可指定中间二进制和目标二进制的存放位置
add_subdirectory(src)
//cmake时,会进入src寻找CMakeLists.txt
将指定目录下所有源文件(所有文件,可能包含不需要的文件)保存在变量中
aux_source_directory(src SRC_LIST)//src目录,SRC_LIST变量
//新建变量存放所需源文件,set定义变量
//set(SRC_LIST
// src/smartswitch.c
// src/sm3.h
// test/main.c)
向工程添加多个指定头文件搜索路径
include_directories(include)
指定项目搜索头文件路径
target_include_directories ( ${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include )
//需要创建项目后再使用
//需要指定 目标 和 路径 以及 属性传递 (属性传递有3个: PRIVATE, PUBLIC 和 INTERFACE),可指定多个路径
生成动态库(SHARED)或静态库(STATIC)(默认)连续使用指定库名不能相同
add_library(smartSwitch_shared SHARED ${SRC_LIST})
add_library(smartSwitch_static STATIC ${SRC_LIST})
//add_library(库名 库的属性 依赖文件)
设置最终库名,还有其他功能,如设置库的版本号等,连续使用可指定相同库名,后缀不同,.a/.so
set_target_properties(smartSwitch_shared PROPERTIES OUTPUT_NAME "smartSwitch")
set_target_properties(smartSwitch_static PROPERTIES OUTPUT_NAME "smartSwitch")
指定目录下查找库,并把库的绝对路径存于变量中 (变量名 库名 HINTS 路径)
find_library(TEST_LIB smartSwitch HINTS ${PROJECT_SOURCE_DIR}/bin)
//默认是动态库,指定:libsmartSwitch.so
//会在camke时就会查找库是否存在,可提前发现问题,不用等到链接时
//find_package库查找,link_directories()库查找,官方不建议使用
将目标文件与库文件进行链接
target_link_libraries(main ${TEST_LIB})
定义变量,存放elf文件的位置设置为工程根目录下的bin目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
CMake自带的预定义变量
EXECUTABLE_OUTPUT_PATH 目标二进制可执行文件的存放位置
PROJECT_SOURCE_DIR 工程根目录
LIBRARY_OUTPUT_PATH 库文件默认输出路径
//CMake内置变量
//CMAKE_CURRENT_SOURCE_DTR 当前CMakeLists.txt文件所在路径
//PROJECT_NAME 对应project()中的值
添加编译选项
add_compile_options(-std=c++11 -Wall)
//-Wall,编译后显示所有警告
//-w,关闭编译时的警告
//-W,只显示编译器认为会出现错误的警告
添加控制选项
//编译部分代码,宏控制
option(MYDEBUG "test001" OFF)
//宏名,描述信息,ON或OFF,可不写,默认OFF
add_definitions(-DMYDEBUG)//向C/C++编译器添加宏,相当于#define MYDEBUG
//命令行控制
cmake . -DMYDEBUG=ON
添加DEBUG信息
CMAKE_BUILD_TYPE
//Debug:用于在没有优化的情况下,使用带有调试符号构建库或可执行文件
//Release:用于构建的优化的库或可执行文件,不包含调试符号
//RelWithDebInfo:由于构建较少的优化库或可执行文件,包含调试符号
//MinSizeRel:用于不增加目标代码大小的优化方式,来构建或可执行文件
set(CMAKE_BUILD_TYPE "Debug")
//CMAKE_CXX_FLAGS_DEBUG
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")//启用gdb
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")//启用优化1~3
//也可通过add_compile_options()添加调试信息,针对所有编译器
//修改变量值方法:CMAKE_C_FLAGS,CMAKE_CXX_FLAGS分别针对C,C++编译器
//$ENV{},获取环境变量
//set(ENV{变量名} 值),设置环境变量
//CXXFLAGS,C++编译器的编译选项
//CFLAGS,C编译器的编译选项
//判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
add_compile_options(-std=c++11)
message(STATUS "optional:-std=c++11")
endif(CMAKE_COMPILER_IS_GNUCXX)