预定义变量的使用
测试目录如下:

image.png
可以看到只有两个源文件hello.c,test.c,cd到build目录执行cmake
cmake_minimum_required(VERSION 3.4.1)
project(hello)
message(STATUS "PROJECT_NAME:" ${PROJECT_NAME}) # project函数里面的值
message(STATUS "CMAKE_MAJOR_VERSION:" ${CMAKE_MAJOR_VERSION}) #cmake主版本号
message(STATUS "CMAKE_MINOR_VERSION:" ${CMAKE_MINOR_VERSION}) #cmake次版本号
message(STATUS "CMAKE_PATCH_VERSION:" ${CMAKE_PATCH_VERSION}) #cmake补丁版本号
message(STATUS "CMAKE_HOST_SYSTEM:" ${CMAKE_HOST_SYSTEM}) #系统
message(STATUS "CMAKE_HOST_SYSTEM_NAME:" ${CMAKE_HOST_SYSTEM_NAME}) #系统名称
message(STATUS "CMAKE_HOST_SYSTEM_VERSION:" ${CMAKE_HOST_SYSTEM_VERSION}) #系统版本
message(STATUS "CMAKE_HOST_SYSTEM_PROCESSOR:" ${CMAKE_HOST_SYSTEM_PROCESSOR}) #处理器类型
message(STATUS "PROJECT_SOURCE_DIR:" ${PROJECT_SOURCE_DIR}) #cmake命令后紧跟的目录,一般是工程的根目录
message(STATUS "PROJECT_BINARY_DIR:" ${PROJECT_BINARY_DIR}) #cmake命令执行的目录
message(STATUS "hello_SOURCE_DIR:" ${hello_SOURCE_DIR}) #cmake命令后紧跟的目录,一般是工程的根目录
message(STATUS "hello_BINARY_DIR:" ${hello_BINARY_DIR}) #cmake命令执行的目录
message(STATUS "CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR}) #当前处理的CMakeLists.txt 所在的路径
message(STATUS "CMAKE_CURRENT_LIST_FILE:" ${CMAKE_CURRENT_LIST_FILE}) #使用这个变量的CMakeLists.txt路径
message(STATUS "CMAKE_CURRENT_LIST_LINE:" ${CMAKE_CURRENT_LIST_LINE}) #当前变量在CMakeLists.txt文件中的行号
message(STATUS "UNIX:" ${UNIX})
message(STATUS "WIN32:" ${WIN32})
add_subdirectory(test)
include_directories(test)
add_executable(main ${SRC_LIST})
target_link_libraries(main t)
执行结果:

image.png
系统环境变量
SET(ENV{CMAKE_INCLUDE_PATH} "hhhh") #设置系统环境变量
message(STATUS "CMAKE_INCLUDE_PATH:" $ENV{CMAKE_INCLUDE_PATH}) #系统环境变量,使用ENV前缀

1S97DASDF@IDV1I$6GM28`9.png
也可以通过以下方式设置:

image.png
搜索所有的源文件
aux_source_directory(. SRC_LIST) //当前目录查找,赋值给变量SRC_LIST
file(GLOB SRC_LIST1 "*.c")
file(GLOB SRC_LIST2 "*.c" "test/*.c") //file方式查找当前目录,test目录
file(GLOB SRC_LIST3 RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.c") //输出相对于指定路径的结果
message(STATUS "SRC_LIST:" ${SRC_LIST})
message(STATUS "SRC_LIST1:" ${SRC_LIST1})
message(STATUS "SRC_LIST2:" ${SRC_LIST2})
message(STATUS "SRC_LIST3:" ${SRC_LIST3})

image.png
可以看到SRC_LIST1,SRC_LIST2都是绝对路径,SRC_LIST,SRC_LIST3是相对路径
设置包含的目录
一般作用是把头文件放到搜索路径下:
include_directories(test)
hello.c里面头文件路径不用修改:
#include <stdio.h>
#include "test.h" //这里就不用绝对路径了
int main()
{
printf("PI:%f\n",PI);
printf("hello world:%d\n",add(1,5));
return 0;
}
设置 target 需要链接的库
add_subdirectory(test) // test目录单独生成库文件
include_directories(test)
add_executable(main ${SRC_LIST})
target_link_libraries(main t) // 这里可以查找到libt.so
配置文件
配置一个头文件将一些 CMake 设置传入到源代码中,例如这里定义一个是否Debug的开关
option (DEBUG "debuggable" ON) //这个变量定义一定写在前面
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h") //以 config.h.in 为模版,替换相关变量以生成 config.h
在指定目录新建一个文件config.h.in,这里文件名可以是其他的,最好有意义

image.png
#cmakedefine DEBUG //这里使用#cmakedefine
执行cmake .. ,在build目录产生了config.h

W4PCB[]@2Z[`]_R_HDRURR4.png
内容如下:
#define DEBUG
可以在CMakeLists.txt中使用这个定义,也可以在源文件中使用:
option (DEBUG "debuggable" ON)
configure_file("${PROJECT_SOURCE_DIR}/config.h.in" "${PROJECT_BINARY_DIR}/config.h")
if(DEBUG)
message(STATUS "DEBUG:" ${DEBUG})
endif(DEBUG)
执行如下:

image.png
在源文件中使用:
#include <stdio.h>
#include "test.h"
#include "build/config.h" //引入头文件
int main()
{
printf("PI:%f\n",PI);
printf("hello world:%d\n",add(1,5));
#ifdef DEBUG
printf("debug:%d\n",1); //打印输出
#endif
return 0;
}
执行结果如下:

XS~01GV`6DU%T5NO2(3P_L5.png
设置编译类型
add_executable(demo demo.cpp) # 生成可执行文件
add_library(common STATIC util.cpp) # 生成静态库
add_library(common SHARED util.cpp) # 生成动态库或共享库
使用shell脚本
新建一个make.sh
#!/bin/bash
cd build
rm -rf *
cmake ..
make
./main
添加可执行权限:chmod u+x make.sh
执行结果:

H@H(5@VANPQGB32VX6(C3$Q.png