`

系统构建之CMake

 
阅读更多

CMake提供了各种前端操作的客户端,各平台上的命令行客户端和GUI客户端。先主要看一下命令行操作的方法。

官方教程官方API文档

一、简单步骤

0、项目准备:项目的每个目录下都需要有CMakeLists.txt(名字区分大小写)文件

1、cd /path/to/build。#在build目录下运行cmake,因为cmake把当前目录作为build目录,存放生成文件和cache文件

2、cmake /path/to/project。

3、make。#该命令的输入项是位于/path/to/project的CMakeLists.tx文件,该文件可以通过include或add_subdirectory命令添加新的输入文件。

4、./target。#运行生成的程序

5、清理target:make clean。但是make distclean无效,无法清理构建过程文件。所以才在第一步中先进入build目录,这就是所谓的外部构建(out-of-source build)。

 

二、CMakeLists.txt语法

0、通用规则:

    a #开头的行为注释行。

    b 指令(参数1 参数2...) 参数使用括弧括起,参数之间使用空格或分号 分开,参数可使用双引号包着SET(SRC_LIST “main.c”)。指令是大小写无关的,参数和变量是大小写相关的。但,推荐指令全部使用大写。

    c 变量使用${}方式取值,但是在 IF 控制语句中是直接使用变量名

    d /字符用作转义字符。

    e 用户可以自定义macro和function,用法同command指令

1、变量类型:Lists and Strings

    a 变量的基本类型是String

    b 变量也可以是list类型。list可被foreach命令枚举、list命令操作。定义list方法如下:

2、流程控制

    a 条件判断:if

# some_command will be called if the variable's value is not:
# empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND.
if(var)
   some_command(...)
elseif(var)
   other_command(...)
else(var)
   last_option(...)
endif(var) 

    b 循环:foreach

set(VAR a b c)
  # loop over a, b,c with the variable f
foreach(f ${VAR})
    message(${f})
endforeach(f) 

    c 循环:while

while(var)
    message(${var})
endwhile(var)

    d 过程定义:macro 和 function

       函数在2.6及以上版本才支持,函数和宏的区别在于函数中可定义局部变量,而宏定义的变量都是全局变量,或者应该是函数是局部的,宏是全局的。

# define a macro hello
macro(hello MESSAGE)
    message(${MESSAGE})
endmacro(hello)
# call the macro with the string "hello world"
hello("hello world")

# define a function hello
function(hello MESSAGE)
    message(${MESSAGE})
endfunction(hello) 

 3、支持正则表达式

^ Matches at beginning of a line or string
$ Matches at end of a line or string
 . Matches any single character other than a newline
[ ] Matches any character(s) inside the brackets
[^ ] Matches any character(s) not inside the brackets
[-] Matches any character in range on either side of a dash
* Matches preceding pattern zero or more times
+ Matches preceding pattern one or more times
? Matches preceding pattern zero or once only
() Saves a matched expression and uses it in a later replacement

 

三、命令API

虽然说Kitware有点儿不厚道的在卖Mastering CMake 这本书,而且貌似网上没有电子版,但是官方提供的文档 还是够用的。在写这篇心得时cmake是2.8版本。

文档也可以通过“cmake --help-html > help_name.html”在当前运行目录生成。

1、command api

2、variables api

 

四、使用技巧

1、如何在构建过程中打印debug等信息到console?

使用MESSAGE命令。message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)

2、过程文件和最终构建的目标文件的路径设置问题。

cmake有一些预定义的变量来设置各种路径。

PROJECT_BINARY_DIR:运行目录,生成过程文件的目录。运行cmake ..的工作目录。这个目录总会有些过程文件生成,因此需要外部构建。

PROJECT_SOURCE_DIR:代码目录,运行cmake ..时..指定的目录

工程组织方式:

proj +
       |
       +src
       +bin
       +build
       |    + bin_1
       +CMakeLists.txt

一般在CMakeLists.txt文件中用ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])指定src、bin目录,可以用相对路径也可以用绝对路径。

但 是要注意,如果用相对路径的话,source_dir是相对PROJECT_SOURCE_DIR(这里是proj目录)的,binary_dir是相对 PROJECT_BINARY_DIR(这里是build)的。所以如果是add_subdirectory(src bin)的话,bin是build下面的bin_1。

 

EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 定义纯净的最终目标文件位置,可以通过下面方法修改

SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
 

1、预定义变量

PROJECT_BINARY_DIR

PROJECT_SOURCE_DIR

EXECUTABLE_OUTPUT_PATH

LIBRARY_OUTPUT_PATH

CMAKE_INSTALL_PREFIX

2、基本指令

PROJECT(projectname [CXX] [C] [Java])

SET(VAR [VALUE [VALUE2] [VALUE3]] [CACHE TYPE DOCSTRING [FORCE]])

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

ADD_EXECUTABLE(targetRunable ${SRC_LIST})

ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

目录的安装:INSTALL(DIRECTORY src_dirs... DESTINATION <dir>

                           [FILE_PERMISSIONS permissions...]

                           [DIRECTORY_PERMISSIONS permissions...]

                           [USE_SOURCE_PERMISSIONS]

                           [CONFIGURATIONS [Debug|Release|...]]

                           [COMPONENT <component>]

                           [[PATTERN <pattern> | REGEX <regex>] [EXCLUDE] [PERMISSIONS permissions...]][...])

DIRECTORY 后面连接的src_dirs注意abc 和 abc/有很大的区别。如果目录名不以/结尾,那么这个目录将被安装为目标路径下的 abc,如果目录名以/结尾, 代表将这个目录中的内容安装到目标路径,但不包括这个目录本身。

3、换个地方保存目标二进制:在 ADD_EXECUTABLE 或 ADD_LIBRARY所在的CMakeLists.txt文件里面定义

    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)

    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

分享到:
评论

相关推荐

    使用vscode cmake插件构建的CMake工程模板

    本教程将详细讲解如何使用VSCode的CMake插件来构建CMake工程模板。 首先,确保你已经安装了VSCode和CMake。VSCode可以从官方网站下载,CMake可以在其官网或通过操作系统自带的包管理器进行安装。同时,确保安装了...

    cmake 构建多文件多目录项目教程

    cmake 构建多文件多目录项目教程 cmake 是一个功能强大且灵活的构建工具,广泛应用于 C++ 项目的构建和管理。下面是 cmake 构建多文件多目录项目的相关知识点: 一、cmake 的常用环境变量 cmake 提供了许多环境...

    CMake实战-20200708.pdf

    其根本原因用KDE开发者的話来说就是:只有少数几个“编译专家”能够掌握KDE现在的构建体系(admin/Makefile.common),在经历了unsermake, scons以及CMake的选型和尝试之后,KDE4决定使用CMake作为自己的构建系统。...

    CMake实战.pdf

    CMake是一种跨平台的自动化构建系统,用于管理软件构建过程。它的主要目标是简化构建流程,使其能够在多种操作系统和编译器环境下工作。CMake不直接进行编译,而是生成针对不同平台的本地构建工具所需的配置文件,如...

    CMake构建OpenGL项目

    为了管理和简化跨平台的构建过程,开发者通常会使用CMake作为构建系统。本篇将详细介绍如何利用CMake来构建一个依赖于glfw、glew、glm以及OpenGL核心库的项目。 首先,CMake是一个开源的、跨平台的自动化构建系统,...

    cmake最新版本cmake-3.24.0

    CMake是一款跨平台的构建系统,它用于管理软件构建过程,尤其在多语言、多配置的项目中表现出色。CMake并不直接构建软件,而是生成特定构建工具(如Makefile或Visual Studio项目)所需的配置文件,然后用户可以使用...

    cmake新版构建工具

    多种构建系统支持:CMake可以生成多种构建系统的脚本,包括Makefile、Ninja、Visual Studio等。这使得开发人员可以使用自己熟悉的构建系统来构建项目。 自动依赖管理:CMake可以自动检测项目的依赖关系,并在构建...

    CMake中文手册_cmake手册_cmake_

    CMake是一种广泛使用的开源构建系统,它旨在简化跨平台软件构建和配置的过程。CMake的中文手册是开发者理解和使用CMake的重要参考资料,它详细解释了CMake的各种概念、语法和功能。 CMake的核心理念是通过一种平台...

    cmake实践 修订版 pdf

    例如,KDE的构建系统由原本复杂的`admin/Makefile.common`转变到了更简洁高效的CMake构建方式。 - **文档与学习资源**:尽管CMake官方文档存在一些不足之处(如错误或不清晰的指导),但用户社区正在积极编写和维护...

    cmake cmake-3.10.0

    CMake是一款跨平台的自动化构建系统,用于管理软件构建过程。CMake不是直接构建软件,而是生成特定构建工具(如Make、Visual Studio、Xcode等)的项目文件,然后使用这些工具进行实际构建。CMake的语法简洁且易于...

    银河麒麟桌面操作系统V10SP1版本-x86架构cmake离线包

    在这个版本中,CMake作为重要的构建系统工具,被集成以支持软件的编译和安装过程。 CMake是一款广泛使用的跨平台自动化构建系统,其主要功能是生成适用于各种编译器和构建工具的项目构建文件。通过CMake,开发者...

    cmake编译工具

    CMake是一种跨平台的开源构建系统,用于管理软件构建过程。它通过简洁的文本文件(CMakeLists.txt)来描述项目结构和构建规则,然后生成针对不同编译器和操作系统平台的本地构建文件,如Makefiles或Visual Studio...

    C-C++项目的自动化构建与部署:使用Jenkins和CMake.md

    接着,讲解了如何编写和配置CMakeLists.txt文件,以自动化生成构建系统和管理构建选项。文章还涉及了高级功能,如环境配置、构建优化、测试与覆盖率报告、版本控制与发布等,提供了一个全面的指南,以帮助读者建立一...

    cmake创建多工程例子

    `CMake`就是这样的一个工具,它是一个跨平台的构建系统,可以用来管理多种编译器和构建过程。本篇文章将深入探讨如何使用`CMake`创建一个多工程的例子,结合`Qt`这一流行的图形界面库。 首先,我们要理解`CMake`的...

    CMake编译器3.25.0 window 64位

    CMake是一种跨平台的构建系统,它用于管理软件构建过程,尤其在多语言、多编译器和多平台的项目中表现出色。CMake不是直接进行编译和链接的工具,而是生成特定平台的构建文件,如Visual Studio的解决方案文件或Unix ...

    cmake菜谱中文版, cmake practice 很好的cmake入门资料

    **CMake:构建系统的选择与实践** CMake是一款强大的跨平台构建工具,它允许开发者用统一的方式管理项目在不同操作系统和编译器上的构建过程。CMake不是直接生成可执行文件,而是生成针对特定平台的Makefile或者IDE...

    cmake-3.10.0-rc3-win64-x64.rar_Cmake3.10.0_Cmake3.10.0下载_cmake 3

    CMake是一款跨平台的自动化构建系统,用于管理软件构建过程。它的主要功能是生成适合各种编译器和构建环境的构建文件,如Unix下的Makefile或Windows上的Visual Studio项目文件。CMake的设计理念是通过一个高级语言...

    cmake-3.6.3和cmake-3.12.2源码

    CMake是一种跨平台的构建系统,它用于管理软件构建过程,尤其适合多语言项目。CMake不是直接构建软件,而是生成特定平台的构建文件(如Unix Makefiles、Visual Studio项目等),然后用户或构建工具使用这些生成的...

    C++通过CMake构建QT 5.12的工程模板

    这是在ubuntu16.04系统下,用C++通过cmake构建qt5.12的工程模板。 自动根据.ui文件生成.h和cpp文件,利用qtcreator修改.ui文件后,无需其他设置,直接make可生成修改后的界面。 使用方法一:按照普通的cmake工程...

    cmake-3.26.5-windows-x86-64

    CMake是一款跨平台的开源构建系统,用于管理软件构建过程。它的主要目标是提供一个抽象层,使得开发者能够用统一的方式在不同的操作系统和构建环境中构建项目,无论你是使用C++、Fortran还是其他语言。CMake并不直接...

Global site tag (gtag.js) - Google Analytics