【CMake的入门使用】

发布于:2024-07-11 ⋅ 阅读:(20) ⋅ 点赞:(0)

一 CMake概述

CMake 可以编译源代码、制作程序库、产生适配器(wrapper)、还可以用任意的顺序建构执行档。CMake 支持 in-place 建构(二进档和源代码在同一个目录树中)和 out-of-place 建构(二进档在别的目录里),因此可以很容易从同一个源代码目录树中建构出多个二进档。CMake 也支持静态与动态程式库的建构。

优点

跨平台,可管理大型项目

简化编译结构和编译过程,高效率

二 CMake使用

CMakeLists.txt文件。


注释

# 注释行
#[[
注释块
]]

常用CMake函数

cmake_minimum_required(VERSION 3.0):指定使用的 cmake 的最低版本
project(pro):定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。
add_executable(可执行程序名 源文件名称)

  • 定义变量
# SET 指令的语法是:
# [] 中的参数为可选项, 如不需要可以不写
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

# 1: 各个源文件之间使用空格间隔
# set(SRC_LIST c/c++文件 c/c++文件 c/c++文件 c/c++文件)

# 2: 各个源文件之间使用分号 ; 间隔
set(SRC_LIST c/c++文件;c/c++文件;c/c++文件;c/c++文件)
add_executable(app  ${SRC_LIST})

  • 增加C++11
set(CMAKE_CXX_STANDARD 11)

  • 输出路径
set(HOME /自己文件所在的位置)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)

  • 搜索文件aux_source_directory
cmake_minimum_required(VERSION 2.0)
project(pro)
# 搜索头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
# 生成可执行文件
add_executable(app  ${SRC_LIST})

  • 搜索文件file
cmake_minimum_required(VERSION 2.0)
project(pro)
set(CMAKE_CXX_STANDARD 11)
set(HOME /自己文件所在的位置)
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin/)
include_directories(${PROJECT_SOURCE_DIR}/include)
# 搜索 src 目录下的源文件
file(pro SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
add_executable(app  ${SRC_LIST})

${CMAKE_CURRENT_SOURCE_DIR}

此变量指当前处理的“CMakeLists.txt”文件所在的目录。当CMake处理项目中不同目录中的每个“CMakeLists.txt”文件时,它会发生变化。
CMAKE_CURRENT_SOURCE_DIR是动态的,反映了当前CMAKE上下文的目录。

${PROJECT_SOURCE_DIR}

此变量指的是当前为其配置CMake的项目的根目录。它被设置为顶级“CMakeLists.txt”文件所在的目录。
“PROJECT_SOURCE_DIR”由CMake根据项目配置自动定义。


  • 制作动态库或静态库
    • 静态库
      • add_library(库名称 STATIC 源文件1 [源文件2] …)
    • 动态库
      • add_library(库名称 SHARED 源文件1 [源文件2] …)

设置动态库生成路径

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)

使用LIBRARY_OUTPUT_PATH,这个宏对应静态库文件和动态库文件都适用。

设置动态库/静态库生成路径

set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)


  • 链接库

link_libraries( […])

包含静态库路径

link_directories(${PROJECT_SOURCE_DIR}/lib)

链接静态库

link_libraries(libxxx.a)

链接动态库

target_link_libraries(可执行文件 pthread)

cmake_minimum_required(VERSION 2.0)
project(TEST)
file(项目名字 SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 指定源文件或者动态库对应的头文件路径
include_directories(${PROJECT_SOURCE_DIR}/include)
# 指定要链接的动态库的路径
link_directories(${PROJECT_SOURCE_DIR}/lib)
# 添加并生成一个可执行程序
add_executable(可执行文件 ${SRC_LIST})
# 指定要链接的动态库
target_link_libraries(可执行文件 pthread calc)

  • 日志

在CMake中可以用用户显示一条消息,该命令的名字为message

message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] “message to display” …)

(无) :重要消息
STATUS :非重要消息
WARNING:CMake 警告, 会继续执行
AUTHOR_WARNING:CMake 警告 (dev), 会继续执行
SEND_ERROR:CMake 错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR:CMake 错误, 终止所有处理过程


add_subdirectory

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

source_dir:指定了CMakeLists.txt源文件和代码文件的位置,其实就是指定子目录
binary_dir:指定了输出文件的路径,一般不需要指定,忽略即可。
EXCLUDE_FROM_ALL:在子路径下的目标默认不会被包含到父路径的ALL目标里,并且也会被排除在IDE工程文件之外。用户必须显式构建在子路径下的目标。
通过这种方式CMakeLists.txt文件之间的父子关系就被构建出来了。


使用

# cmake 命令原型
cmake CMakeLists.txt文件所在路径

常用宏

功能
PROJECT_SOURCE_DIR 使用cmake命令后紧跟的目录,一般是工程的根目录
PROJECT_BINARY_DIR 执行cmake命令的目录
CMAKE_CURRENT_SOURCE_DIR 当前处理的CMakeLists.txt所在的路径
CMAKE_CURRENT_BINARY_DIR target 编译目录
EXECUTABLE_OUTPUT_PATH 重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH 重新定义目标链接库文件的存放位置
PROJECT_NAME 返回通过PROJECT指令定义的项目名称
CMAKE_BINARY_DIR 项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径