CMake基础知识学习

目录

  • 概述
  • 典型用法
  • 变量
  • 常用函数
  • 常用功能

本文主要参考CMake官方教程


概述

  1. CMake是一个MakeFile生成器,由源代码生成各种MakeFile后,交给Make工具去编译;
  2. Windows上也可以生成VS工程,然后采用VS进行编译;
  3. CMake被用于C/C++较多,但也能用于别的编程语言;

典型用法

# 指定cmake最小版本,考虑 本项目/子项目/链接库等 对cmake版本的要求
# 有的语句是从特定版本才开始支持的
cmake_minimum_required( VERSION 3.10 )

# 声明一个工程
project(MyProject)

# 添加一个可执行文件,源文件由main.cpp组成,也可后面再添加需要的内容
add_executable(main main.cpp)

# 添加一个库文件
add_library(mylib mylib.cpp)

# 添加包含目录,位置在CMakeLists.txt所在目录下的include/文件夹
target_link_directories(main PUBLIC include/)

# 将库文件链接到可执行文件
target_link_libraries(main mylib)

变量

CMake中的变量可在IF语句中直接调用,也可以在其它位置采用${VAR_NAME}的方式调用。

可以使用set(VAR_NAME value)来设置变量的值,不用声明。

可以在CMakeLists中使用环境变量:$ENV{env_name}

CMake中有很多内置变量,常用的有:

  1. PROJECT_SOURCE_DIRCMakeLists.txt所在目录
  2. PROJECT_BINARY_DIR:调用cmake指令的目录,如创建build文件夹后,在build文件夹中打开终端后cmake ..,该变量的值就指向build目录
  3. 判断平台:UNIX WIN32
  4. 判断编译器:MSVC MINGW,还可以MSVC_VERSION获取MSVC版本;
  5. CMAKE_RUNTIME_OUTPUT_DIRECTORY,可简单理解为exe文件的输出目录
    CMake基础知识学习_第1张图片
  6. CMAKE_LIBRARY_OUTPUT_DIRECTORY:可简单理解为共享库dll或so文件的输出目录
    CMake基础知识学习_第2张图片
  7. CMAKE_ARCHIVE_OUTPUT_DIRECTORY:可简单理解为静态库lib或a文件的输出目录
    CMake基础知识学习_第3张图片

    以上3个变量还可以添加后缀,指定_DEBUG_RELEASE时的输出目录,不指定时将在设置的目录下在添加Debug/Release目录:

    # debug模式下输出到对应目录,没有后缀时,将生成Debug/Release文件夹
    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ./bin) 
    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ./lib)
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ./dll)
    

    有3个类似的变量RUNTIME_OUTPUT_DIRECTORY、LIBRARY_OUTPUT_DIRECTORY、ARCHIVE_OUTPUT_DIRECTORY,但笔者在设置了之后,输出文件并没有生成在对应目录下。

    这3个变量是由上述3个CMAKE_开头变量对应初始化的。

更多信息请参考CMake Variables。

常用函数

  1. project():设置项目名称,将其存储到PROJECT_NAME变量中,在最顶层的CMakeLlists.txt中调用时,也会将名称存储到CMAKE_PROJECT_NAME中;

  2. configure_file( ):将中的内容全部复制到中,并替换其中的@var@${var}变量,可以实现CMakeLists.txt中的变量带入程序中的效果,比如:在CMakeLists.txt中定义了程序版本,可以在程序中获取版本值;

  3. add_subdirectory(

    [bin_dir] [EXCLUDE_FORM_ALL] ):为项目添加一个子目录,指定子目录位置,[bin_dir]指定生成目录,可以相对路径或是绝对路径,最后一个参数表明该子目录下的内容需要显式地编译或自行编译(一般用于示例代码等);

  4. option():添加CMake调用时的选项,如option( USE_MYMATH "use my math lib" ON),然后可以这样调用:cmake -DUSE_MYMATH=OFF .;而且,可以在configure_file中这样定义变量:#cmakedefine USE_MYMATH,当选项为ON时,该宏才会被定义到中,然后在程序中使用#ifdef USE_MYMATH

    option()要在configure_file()之前调用,因为后者要读取前者结果;

  5. target_include_directories():添加编译给定目标时的包含目录,比如添加源码目录下的include文件夹

    target_include_directories( main PUBLIC ${PROJECT_SOURCE_DIR}/include)
    
  6. install():将编译生成目标和一些文件等,安装到指定目录,常用形式:

    install( TARGETS mylib DESTINATION lib)
    install( FILES mylib.h DESTINATION include)

常用功能

  1. 使用C++11

    # specify the C++ standard
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED True)
    
  2. 指定VS工程版本:

    cmake -G "Visual Studio 14 2015" -A Win32 .
    cmake -G "Visual Studio 14 2015" -A x64 .
    cmake -G "Visual Studio 14 2015" -A ARM .
    
  3. 指定工具集,如采用MSVC2017编译器:

    # 140,141,142,143分别对应MSVC2015 2017 2019 2022
    cmake -T v141 .
    

你可能感兴趣的:(CMake,cmake)