cmake语法

2023-05-16

目录

  • 基本语法
    • 命令行
    • project
    • add_executable
    • target_sources
    • set
    • file
    • add_library
    • message
    • target_link_libraries
    • target_include_directories
    • find_package
  • 标准模板

基本语法


命令行

  1. cmake -B build
    进行build目录的创建与Makefile等构建文件的生成。
    可加参数 -DCMAKE_BUILD_TYPE=RELEASE 自由调节编译的模式。
    可加参数 -G Ninja 改变构建时候用的程序,由于Ninja出现的比较晚,性能表现上一般会更好。
  2. cmake --build build
    在build目录下并行构建。
    可加参数 --parallel 32 进行并行构建

project

  1. 参数加上项目的名字,比如 project(hello_world)
  2. 这个有什么用呢,其实没什么用,但是又有那么一点用。
  3. 比如 MSVC 会使用这个项目名在 build 里面生成 hello_world.sln 文件以作他用,也算是一点用。
  4. 同时这个命令会初始化一些可以访问的变量,例如 PROJECT_NAME,会输出 hello_world。类似的还有
    1. PROJECT_SOURCE_DIR
    2. PROJECT_BINARY_DIR
    3. CMAKE_CURRENT_SOURCE_DIR
    4. CMAKE_CURRENT_BINARY_DIR
    5. 等~
  5. 还有一个很重要的参数 LANGUAGES 字段,默认情况下为 C 和 CXX,使用这个参数则可以明确的指定项目需要的语言(可以多于一种)。例如如果指定了语言为 CXX,那么添加一个C语言的文件就会报错。

add_executable

  1. 第一个参数是可执行文件的名称,指明生成的可执行文件
  2. 之后的参数写可执行文件所依赖的cpp文件,这部分可以暂时不加后面的依赖文件,后续通过 target_sources 命令补加。

target_sources

  1. 补充上一条命令,为可执行文件添加依赖的cpp文件。第一个参数写可执行文件,第二个参数写 PUBLIC 表示依赖的权限,之后的参数写依赖的文件cpp文件。

set

  1. 比较重要的一条命令,定义 cmake 中的变量。第一个参数写变量的名称,后续参数写变量所指代的内容。
  2. cmake 所定义的变量在后续的使用时要通过 ${变量名} 语法进行访问。

file

  1. 也是一条定义变量的命令,在形式上为set的书写做了一些简化
  2. 第一个参数可以写 GLOB 表示当前目录的搜索,也可以写 ** GLOB_RECURSE** 表示当前目录与其子目录递归的搜索。
  3. 第二个参数写变量名。
  4. 第三个参数可写可不写,CONFIGURE_DEPENDS 表示后续的文件产生增加等变化时cmake会重新进行一次构建,如果不写这个参数那么添加一个新的cpp可能就不能被及时的放进变量中,导致编译失败。
  5. 之后的参数形如 *.cpp *.h 等,表示通配的内容,当前目录下所有类似形式的文件名都会被放入变量之中以供取用。

add_library

  1. 生成库文件,第一个参数是库文件的名称,第二个参数可以用STATIC或者SHARED,分别代表动态库和静态库,之后的参数写库所依赖的cpp文件即可。
  2. 还有一种很厉害的库叫对象库,参数用 OBJECT 表示。对象库厉害就厉害在他不生成一个库,而是直接把库内容植入使用库的可执行文件中,浑然天成。那有人就会问了,不生成库直接植入在可执行文件中,那我为什么还要打一个库,岂不是多此一举,直接把cpp依赖加入可执行文件不就行了。诶,这你就有所不知了,我自己打成一个库不就可以使用和可执行文件不同的编译选项。
  3. 在 linux 下生成的静态库以 .a 结尾,动态库以 .so 结尾。
  4. 在 windows 下静态库以 .lib 结尾,动态库以 .dll 结尾。

message

  1. 打印指令,里面加字符串可以在cmake的时候输出信息,字符串中可以使用 ${变量名} 语法来打印之前定义的变量。
  2. 这个命令可以加修饰符来表示不同信息的打印
    1. 可以什么都不加,直接写一个字符串,这个情况就表示我知道你很急,但是你先别急,字符串会直接打印在屏幕上不加任何修饰。
    2. 可以加 STATUS 再写字符串,这个情况是正常的信息输出,一般会在前面给加两个杠 “--”。
    3. 可以加 WARNING,这个情况表示值得注意了,可能与预期不符,一般会改变成黄色并和下面留出一段距离。
    4. 可以加 FATAL_ERROR,这个情况就非常的危及,发生了红色错误并且直接停止 cmake,比如用 find_package 寻找一个库找不到的时候就会发这个信息。
    5. 可以加 SEND_ERROR,也是发红色错误信息,但是并不停止 cmake,应该是还没有危及到生命。

target_link_libraries

  1. 创建了可执行文件和库文件之后,如果想用可执行文件就需要这个命令。他的第一个参数是希望添加的目标可执行文件,第二个参数是 PUBLIC 表示链接权限,之后的参数写想要链接的库文件。

target_include_directories

  1. 添加我们某一个目录为目标文件的include搜索目录。
  2. 第一个参数写目标文件,可以是一个可执行文件也可以是一个库文件。
  3. 第二个参数写 PUBLIC 或者 PRIVATE,表示添加的权限,如果是公有的那么在其他可执行文件链接的时候也会传播include的搜索目录,私有的则不会。
  4. 之后的参数需要能够表示一个目录的路径,例如写一个库文件就表示库文件所在的目录路径,写一个 . 就表示目标文件所在的目录路径。

find_package

  1. 通过 find_package 这个命令查找预安装的库,原理是通过执行预安装的 XXXConfig.cmake 文件,通过这个文件引入一些依赖或定义一些变量,然后我们的项目中就可以使用这个库了。
  2. 例如 find_package(TBB REQUIRED) 这个命令就会执行 TBBConfig.cmake 引入 TBB 这个库。
  3. REQUIRED 表示在找不到所需的包时发出错误信息并停止构建,如果省略了 REQUIRED 则当 cmake 没有找到 TBB 时会继续构建,这可能导致编译错误或运行时错误。
  4. find_package(TBB) 会把一个变量 TBB_FOUND 根据有没有找到设置为 treu 或 false。如果不加 REQUIRED 选项也是可以的,这时就需要用户通过手动判断 TBB_FOUND 来保证安全,例如在未找到库时可以发出一段警告,或者通过 TBB_FOUND 的值来定义一个 WITH_TBB 的宏在源文件内,通过这个宏分别实现带 TBB 库和不带 TBB 库的两套版本。

标准模板

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cmake语法 的相关文章

  • 让 CMake 将生成的二进制文件与资产一起放入特定的目录结构中

    我的项目的目录结构基本如下 root src 根 资产 根 库 我目前已将 CMake 设置为编译源代码 编译库 然后通过从根目录调用 make 来链接它们 然后 我必须手动将可执行文件移动到原始资产目 录中以使其运行 因为这是它期望的位置
  • cmake:如何制作一个脚本来复制我的程序附带的数据文件

    我正在尝试使用 cmake 自动化我的构建过程 目前只有一个问题 在cmake的哲学 如果有的话 中 最好的地方在哪里 放置数据文件的复制 我有一个图书馆和一些例子 例子需要数据 我目前执行以下操作 我在每个示例的 CMakeLists t
  • Android Studio 中的多个本机模块

    我有一个当前在 Visual Studio 中设置的 C 代码库 在 Windows 上运行 其中包含多个具有相互依赖关系的项目 我正在尝试将其转移到 Android Studio 以使其在 Android 上运行 我熟悉 Visual S
  • CMake - 找不到 Boost(缺少:序列化)(找到版本“1.73.0”

    我已经在我的项目中使用 Boost 一段时间了 但到目前为止 我只使用了仅包含头文件的库 我现在想使用序列化 但是当我尝试将序列化添加为必需组件时 我收到标题中写入的错误 这是我的 CMAKE 文件 cmake minimum requir
  • 如何将 Zlib 与 Cmake 链接

    我试图将我的文件与 zlib 库链接 但仍然得到 对 deflateInit 的未定义引用 我目前正在使用CLion 已从主页下载了zLib文件并将其添加到项目中 这就是我的 CmakeLists txt 的样子 cmake minimum
  • CMake FindThreads.cmake 找不到我的 pthreads.h 标头

    我在用着android cmake http code google com p android cmake 编译 Android 应用程序 这实质上创建了一个 CMake 工具链文件 用于使用 Android NDK 提供的工具链 As
  • CMake add_custom_target 取决于正在构建的整个项目

    我想添加一个依赖于成功构建的整个项目的测试目标 而无需重新指定对所有库或可执行文件的依赖关系 我会在 make 中将其写为 all foo bar foo bar test all test sh test sh 隐式使用 foo 和 ba
  • 强制 target_link_libraries 使用 C++ 链接器

    TL DR 将静态 c 库链接到 c 可执行文件时 有没有办法强制 cmake 使用 c 链接器 我有一个静态库 由 2 个对象组成 一个 C 文件和一个该文件中函数的 C 包装器 构造函数 析构函数和打印函数 类似于this https
  • 使用 CMake 在主项目之前强制构建外部项目(使用 buildtools)

    我想在开始构建我的主项目之前构建 gsl 我将以下行添加到 rootCMakeLists txt file cmake minimum required VERSION 2 8 project moose include CheckIncl
  • cmake 在 OS X 上找不到 gl.h

    我在 OS X 10 10 上并尝试使用 GLUT 和 OpenGL 构建一个 C 项目 我将其简化为展示我的问题的最小示例 我有以下内容CMakeLists txt cmake minimum required VERSION 2 8 F
  • 将 CMake 变量从 GUI 导出到命令行

    是否可以将 CMake GUI 中设置的所有变量值导出到单个命令行字符串 以便可以从外部工具快速使用它 所以输出会是这样的 cmake DVar1 ON DVar2 foo 你可以从 Tools gt Show My Changes
  • 如何从单独的文件下载用于 cmake 中交叉编译的工具链?

    我有一个项目 根目录中有一个 CMakeLists txt 文件 该项目在 Linux 和 OSX 上编译得很好 现在我想为 MIPS OpenWRT 交叉编译它 我想尽可能地自动化它 所以我将使用以下代码来下载工具链并设置编译器变量 Ex
  • 如何检测当前作用域在 CMake 中是否有父作用域?

    有什么方法可以检测当前作用域是否有父作用域 我有一个项目 可以是独立项目 也可以是另一个项目的子项目 为了允许子项目情况 我使用 PARENT SCOPE 标志来 set 将内容推送到父项目 但是 当构建为独立项目时 我收到 当前范围没有父
  • cmake中如何连接字符串

    有没有办法在cmake中连接字符串 我有一个仅包含具有主要方法的 cpp 文件的文件夹 我认为只需在所有 src 文件中使用 foreach 就很容易了 这就是我到目前为止所得到的 project opengl tutorial cmake
  • cmake 发现错误的 python 库

    我是 CMake 新手 无法理解一些使用概念 我正在从 C 程序调用 python 脚本 include
  • 使用 CMake 链接 .s 文件

    我有一个我想使用的 c 函数 但它是用Intel编译器而不是gnu C编译器 我在用着cmake构建程序 我实际上正在使用ROS因此rosmake但基础是cmake所以我认为这更多是一个 cmake 问题而不是ROS问题 假设使用构建的文件
  • VS 2015 命令提示符中不再找到 rc.exe

    我刚刚安装了 Windows 10 创意者更新 版本 10 0 15063 我安装了多个版本的 Visual Studio 2012 2013 2015 和 2017 我几周前才安装了 VS 2017 Problem CMake 版本 3
  • CMake:不支持的 GNU 版本 - 不支持高于 8 的 gcc 版本

    在降级我的 GCC 之前 我想知道是否有一种方法可以确定我的机器中的哪些程序 框架或依赖项将被破坏 以及是否有更好的方法来安装 openpose 例如 更改 CMake 中的某些内容 有没有办法可以解决这个问题 而无需更改我的系统 GCC
  • 如何从 CMake 运行 .bat 文件?

    如何在预链接或构建后事件中从 CMake 运行 bat 文件 你可以使用add custom command e g if WIN32 add custom command TARGET
  • 使用 OpenCL 支持构建 OpenCV

    在 CMake 中 我使用 OpenCL Enable ON 构建了 OpenCV 它自动检测到OPENCL INCLUDE DIR路径但是OPENCL LIBRARY即使单击配置后也是空的 为了OPENCL LIBRARY我也没有看到浏览

随机推荐

  • OpenMV识别色块与STM2F4通过串口通信

    花了三天时间学习了一下OpenMV的简单使用 xff0c 在这写个博客记录一下 xff0c 并且上传自己的代码 xff0c 以方便交流学习 第一次发帖 xff0c 不周之处见谅 首先概括一下我实现的功能 xff1a OpenMV识别红色色块
  • c++语言简单提问

    1 定义一个空的类型 xff0c 里面没有任何成员变量和成员函数 对该类型求sizeof xff0c 得到的结果是 1 2 为什么不是0 空类型的实例中不包含任何信息 xff0c 本来求sizeof应该是0 xff0c 但是当我们声名该类型
  • 二 ROS通信机制-话题通信(发布订阅模式)

    二 ROS通信机制 话题通信 发布订阅模式 ROS 中的基本通信机制2 1话题通信 发布订阅模式 2 1 1概念2 1 2作用2 1 3 理论模型2 1 4 话题通信应用时需要关注的地方 xff1a 3 简单实现3 1ROS工作空间建立 x
  • 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题

    解决ROS中运行launch文件报错ERROR cannot launch node of type xxx xxx xxx的问题 错误截图 xff1a 原因 xff1a 解决方式 xff1a 当时我出现的错误是 ERROR cannot
  • c++ stl 五种迭代器

    c 43 43 stl 五种迭代器 2010 12 31 14 22 25 分类 xff1a C 43 43 C 举报 字号 订阅 下载LOFTER 我的照片书 迭代器的分类 Iterator Categories I
  • C语言头文件中定义变量问题(转)

    上个星期回学校的时候 xff0c 刚好碰到一个学弟在写程序 xff0c 并且刚好碰到一个总编不过去的问题 xff0c 我看了看 xff0c 正好是个头文件重复包含问题 xff0c 问题描述如下 xff1a 他在程序中建立了一个global
  • Opencv Aruco识别(python)

    效果图 先上效果 代码 直接上代码 xff1a span class token operator span span class token operator span usr span class token operator span
  • Windows下Cmake安装步骤详解(图文)

    文章目录 Cmake介绍Cmake下载及安装 Cmake介绍 CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 并且输出对应的makefile或者pro
  • C语言:通过指针模拟实现strcat函数

    模拟实现strcat strcat函数的功能 把src所指向的字符串 xff08 包括 0 xff09 复制到dest所指向的字符串后面 xff08 删除dest原来末尾的 0 xff09 要保证dest足够长 xff0c 以容纳被复制进来
  • C语言中将字符串拆分再进行拼接

    我们有时候需要对于字符串进行操作 xff0c 主要用到strcat和strtok两个函数 xff0c 因此记录下这次的操作方式以便之后查阅 span class token macro property span class token d
  • 并行编程实现矩阵乘法优化

    实现四种矩阵乘法程序 xff0c 并对比运行效率 1 xff09 串行算法 2 xff09 Catch优化 3 xff09 SSE版本 4 xff09 分片策略 span class token macro property span cl
  • c++的函数reserve()和unique()和sort()

    函数reserve span class token comment vector reserve span span class token macro property span class token directive keywor
  • 关于c中代码加 ‘\‘ 进行换行的说明

    我们在c与c 43 43 中经常会遇到一种情况就是加 进行换行来保持代码整体结构一致的使用情况 xff0c 那么具体来说换行的规则是什么 xff0c 这里进行一下记录 span class token macro property span
  • git的命令总结

    先把清单列出来git cheat sheet git 命令总结 git的init和git clonegit add和git commit 提交二连git checkout 反向操作git reset 回退HEAD指针git revert 同
  • 宏定义中的可变参数 __VA_ARGS__ 用法 与 #和##的用法

    首先了解一下可变参数 span class token macro property span class token directive keyword include span span class token string lt st
  • C++结构体简单链表原理解释

    对结构体简单链表原理的简单解释 xff0c 程序如下 xff1a struct lianbiao int no string name struct lianbiao next lianbiao head 61 nullptr tail 6
  • linux小连招

    Linux命令目录 查看当前shell的种类find命令查找文件 查看当前shell的种类 查看当前发行版可以使用的shell xff1a chao 64 chao span class token function cat span et
  • 侵略性奶牛(对于二分的总结)

    题目 Farmer John has built a new long barn with N 2 lt 61 N lt 61 100 000 stalls The stalls are located along a straight l
  • To Fill or Not to Fill(贪心算法)

    题目描述 有了高速公路 xff0c 开车从杭州到任何其他城市都很容易 但由于汽车的油箱容量有限 xff0c 我们必须不时地在路上找到加油站 不同的加油站可能会给出不同的价格 你被要求仔细设计最便宜的路线去 输入描述 对于每个测试实例 第一行
  • cmake语法

    目录 基本语法命令行projectadd executabletarget sourcessetfileadd librarymessagetarget link librariestarget include directoriesfin