cmake之常用命令

 

概述

更多详细示例请点击cmake-demo查看

步骤

windows下需要手动设置编译器

  1. mkdir build
  2. cd build
  3. cmake ../
  4. make
  5. 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()