概述
更多详细示例请点击cmake-demo查看
步骤
windows下需要手动设置编译器
- mkdir build
- cd build
- cmake ../
- make
- make install
基本项目
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo1)
# 指定生成目标
add_executable(${PROJECT_NAME} main.cc)
查找目录下的所有源文件
# 查找目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 多目录
aux_source_directory(. DIR_SRCS)
aux_source_directory(<src_dir> DIR_SRCS)
添加头文件路径
类似于 makefile
中的 -I
include_directories ("${PROJECT_SOURCE_DIR}/math")
添加子目录
把子目录中的文件生成静态库,并在主目录中链接
# 添加 math 子目录
add_subdirectory(math)
# 添加链接库
target_link_libraries(Demo MathFunctions)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 指定生成 MathFunctions 链接库
add_library (MathFunctions ${DIR_LIB_SRCS})
添加C CXX语言版本
# 设置C CXX版本
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
添加编译选项
设置全局编译选项
add_compile_options(-c -g -Wall)
设置C和CXX编译选项
# C编译器
set(CMAKE_C_FLAGS "-fPIC -c -g -Wall -O2 -DENABLE_DM_AUDIO")
set(CMAKE_C_FLAGS_DEBUG "-g")
set(CMAKE_C_FLAGS_RELWITHDENINFO "-O2 -g")
# CXX编译器
set(CMAKE_CXX_FLAGS "-std=c++11 -fPIC -c -g -Wall -O2 -DENABLE_DM_AUDIO")
set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELWITHDENINFO "-O2 -g")
添加三方库路径
link_directories(<lib_dir> ...)
链接三方库
target_link_libraries(${PROJECT_NAME}
-static # 可选,静态链接
pthread
dl
json
)
cmake常用变量
# 项目名称
PROJECT_NAME
# CMakeList.txt文件所在工作目录路径
CMAKE_CURRENT_SOURCE_DIR
CMAKE_SOURCE_DIR
CMAKE_CURRENT_BINARY_DIR
CMAKE_BINARY_DIR
# cmake文件全路径(带本身文件名)
CMAKE_CURRENT_LIST_FILE
# 使用string操作去掉文件本身名字
string(REPLACE "/config.cmake" "" project_dir "${CMAKE_CURRENT_LIST_FILE}")
# cmake文件所在路径
CMAKE_CURRENT_LIST_DIR
# 操作系统名字 Windows Linux
CMAKE_SYSTEM_NAME
CMAKE_HOST_SYSTEM_NAME
# 操作系统架构名 AMD64 x86_64
CMAKE_SYSTEM_PROCESSOR
CMAKE_HOST_SYSTEM_PROCESSOR
# 编译类型 Debug Release
set(CMAKE_BUILD_TYPE "Debug")
# 打开编译详细日志 ON OFF
set(CMAKE_VERBOSE_MAKEFILE ON)
# 编译生成compile_commands.json文件
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
QT
# qt支持变量,必须打开
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
cmake同时编译多个可执行程序
cmake_minimum_required(VERSION 3.0.0)
project(chat VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(ASIO_INCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/../../../../include)
file(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
foreach(file ${files})
get_filename_component(name ${file} NAME)
string(REPLACE ".cpp" "" exe_name ${name})
add_executable(${exe_name} ${file})
target_compile_options(${exe_name} PUBLIC -DASIO_STANDALONE)
target_include_directories(${exe_name} PUBLIC ${ASIO_INCLUDE})
target_link_libraries(${exe_name} PUBLIC -lwsock32 -lws2_32)
endforeach()
cmake查找可执行程序并返回路径
find_program(MY_EXECUTABLE_PATH "vim")
if(MY_EXECUTABLE_PATH)
message(STATUS "Found MyExecutable:${MY_EXECUTABLE_PATH}")
# TODO:
else()
message(WARNING "Not Found MyExecutable")
endif()