Cmake用户交互指南

news2024/10/7 11:20:34

文章目录

  • 一. 介绍
    • 1. 命令行cmake工具
    • 2. cmake gui工具
  • 二. 生成构建系统
    • 1. 命令行环境
    • 2. 命令行-G选项
    • 3. 在cmake gui中选择生成器
  • 三. 设置生成变量
    • 1. 在命令行上设置变量
    • 2. 使用cmake gui设置变量
    • 3. CMake缓存
  • 四. 预设
    • 1. 在命令行上使用预设
    • 2. 在cmake gui中使用预设
  • 五. 调用Buildsystem
    • 1. 选择目标
    • 2. 指定生成程序
  • 六. 软件安装
  • 七. 运行测试

一. 介绍

如果某个软件是基于CMake的构建系统来为其提供其它软件库的来源,则这个软件的使用者必须运行CMake用户交互工具来构建该软件。

1. 命令行cmake工具

cmake的一个简单但典型的用法是创建一个构建目录并在那里调用cmake:

cd some_software-1.4.2
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/opt/the/prefix
cmake --build .
cmake --build . --target install

建议在源代码的单独文件夹(build文件夹)中进行构建,因为这样可以保持源代码文件夹的原始状态,允许使用多个工具链构建单个源代码,并且只需删除构建文件夹(build文件夹)即可轻松清除不需要的构建项目。
CMake工具可能会报告针对软件提供商而非软件消费者的警告。此类警告以“此警告适用于项目开发人员”结尾。用户可以通过将-Wno-dev标志传递给cmake来禁用此类警告。

2. cmake gui工具

更习惯于GUI界面的用户可以使用cmake-GUI工具来调用cmake并生成构建系统。
首先,必须填充源代码目录和生成的二进制保存目录。总是建议对源代码和构建目录使用不同的文件夹。
在这里插入图片描述

二. 生成构建系统

有几个用户界面工具可以用来从CMake文件生成构建系统。ccmake和cmake gui工具指导用户设置各种必要的选项。可以调用cmake工具来指定命令行上的选项。本说明描述了可以使用任何用户界面工具设置的选项,尽管每个工具的选项设置模式不同。

1. 命令行环境

当使用命令行构建系统(如Makefiles或Ninja)调用cmake时,有必要使用正确的构建环境来确保构建工具可用。CMake必须能够根据需要找到合适的构建工具、编译器、链接器和其他工具。

在Linux系统上,适当的工具通常在系统范围内的位置提供,并且可以通过系统包管理器轻松安装。也可以使用用户提供的或安装在非默认位置的其他工具链。

在交叉编译时,一些平台可能需要设置环境变量,或者可能提供脚本来设置环境。
Visual Studio提供了多个命令提示符和vcvarsall.bat脚本,用于为命令行构建系统设置正确的环境。虽然在使用Visual Studio生成器时不一定需要使用相应的命令行环境,但这样做没有任何缺点。

使用Xcode时,可以有多个Xcode版本i

2. 命令行-G选项

CMake默认情况下会根据平台选择生成器。通常,默认生成器足以允许用户继续构建软件。
用户可以使用-G选项覆盖默认生成器:

cmake .. -G Ninja

cmake --help的输出包括可供用户选择的生成器列表。请注意,生成器名称区分大小写。

  • 在类Unix系统(包括Mac OS X)上,默认使用Unix Makefiles生成器。该生成器的变体也可以在Windows上的各种环境中使用,例如NMake MakefilesMinGW Makefiles生成器。这些生成器生成一个Makefile变体,可以使用make、gmake、nmake或类似工具执行。有关目标环境和工具的更多信息,请参阅各个生成器文档。

  • Ninja生成器可在所有主要平台上使用。ninja是一个构建工具,在用例中与make类似,但侧重于性能和效率。

  • 在Windows上,cmake可用于为Visual Studio IDE生成解决方案。Visual Studio版本可以由IDE的产品名称指定,其中包括四位数的年份。别名是为Visual Studio版本提供的其他方式

    cmake .. -G "Visual Studio 2019"
    cmake .. -G "Visual Studio 16"
    cmake .. -G "Visual Studio 16 2019"
    

    Visual Studio生成器可以针对不同的体系结构。可以使用-A选项指定目标系统结构:

    cmake .. -G "Visual Studio 2019" -A x64
    cmake .. -G "Visual Studio 16" -A ARM
    cmake .. -G "Visual Studio 16 2019" -A ARM64
    
  • 在Apple上,Xcode生成器可以用于为Xcode IDE生成项目文件。

一些IDE,如KDevelop4QtCreatorCLion,对基于CMake的构建系统提供了本地支持。这些IDE提供了用户界面,用于选择要使用的底层生成器,通常是在Makefile或基于Ninja的生成器之间进行选择。

请注意,在第一次调用CMake之后,不可能使用-G更改生成器。要更改生成器,必须删除生成目录,并且必须从头开始生成。在生成Visual Studio项目和解决方案文件时,最初运行cmake时可以使用其他几个选项。

可以使用cmake -T选项指定Visual Studio工具集:

# Build with the clang-cl toolset
cmake.exe .. -G "Visual Studio 16 2019" -A x64 -T ClangCL
# Build targeting Windows XP
cmake.exe .. -G "Visual Studio 16 2019" -A x64 -T v120_xp

-A选项指定_target_体系结构,-T选项可用于指定所用工具链的详细信息。例如,可以使用-Thost=x64来选择主机工具的64位版本。以下内容演示了如何使用64位工具,以及如何构建64位目标体系结构:

cmake .. -G "Visual Studio 16 2019" -A x64 -Thost=x64

3. 在cmake gui中选择生成器

Configure按钮触发一个新对话框,选择要使用的CMake生成器。
在这里插入图片描述
命令行上可用的所有生成器在cmake gui中也可用。
在这里插入图片描述
选择Visual Studio生成器时,可以使用其他选项来设置要为其生成的体系结构。
在这里插入图片描述

三. 设置生成变量

软件项目通常需要在调用CMake时在命令行上设置变量。下表列出了一些最常用的CMake变量:

变量描述
CMAKE_PREFIX_PATH要搜索的依赖程序包路径
CMAKE_MODULE_PATH搜索其他CMake模块的路径
CMAKE_BUILD_TYPE构建类型选项, 例如 Debug or Release, 确定调试/优化标志. 这只适用于单配置构建系统,例如 Makefile and Ninja. Visual Studio和Xcode等多配置构建系统会忽略此设置.
CMAKE_INSTALL_PREFIX当使用 install选项时,使用此路径将软件安装到的位置
CMAKE_TOOLCHAIN_FILE包含交叉编译数据的文件,例如 toolchains and sysroots.
BUILD_SHARED_LIBS是否为不带类型的命令,例如add_library()构建共享库而不是静态库 commands used without a type
CMAKE_EXPORT_COMPILE_COMMANDS生成一个compile_commands.json文件,用于基于clang的工具

1. 在命令行上设置变量

创建初始构建时,可以在命令行上设置CMake变量:

mkdir build
cd build
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Debug

或者稍后在随后调用cmake时:

cd build
cmake . -DCMAKE_BUILD_TYPE=Debug

-U标志可用于取消设置cmake命令行上的变量:

cd build
cmake . -UMyPackage_DIR

最初在命令行上创建的CMake构建系统可以使用CMake gui进行修改,反之亦然。
cmake工具允许使用-C选项指定用于填充初始缓存的文件。这对于简化重复需要相同缓存项的命令和脚本非常有用。

2. 使用cmake gui设置变量

可以使用Add Entry按钮在cmake gui中设置变量。这将触发一个新对话框来设置变量的值。
在这里插入图片描述

3. CMake缓存

当执行CMake时,它需要找到编译器、工具和依赖项的位置。它还需要能够一致地重新生成构建系统,以使用相同的编译/链接标志和依赖项路径。这样的参数也需要由用户配置,因为它们是特定于用户系统的路径和选项。

首次执行时,CMake会在构建目录中生成一个CMakeCache.txt文件,其中包含此类工件的键值对。用户可以通过运行cmake gui或ccmake工具来查看或编辑缓存文件。这些工具提供了一个交互式界面,用于在编辑缓存值后重新配置所提供的软件和重新生成构建系统。每个高速缓存条目可以具有相关联的短帮助文本,该文本显示在用户界面工具中。

四. 预设

CMake理解一个文件CMakePresets.json及其特定于用户的对应文件CMakeUserPresets.json,用于保存常用配置设置的预设。这些预设可以设置生成目录、生成器、缓存变量、环境变量和其他命令行选项。所有这些选项都可以由用户覆盖。cmake预设手册中列出了cmake预设.json格式的全部详细信息。

1. 在命令行上使用预设

当使用cmake命令行工具时,可以使用--preset选项调用预设。如果指定了--preset,则不需要生成器和生成目录,但可以指定它们来覆盖它们。例如,如果您有以下CMakePresets.json文件:

{
  "version": 1,
  "configurePresets": [
    {
      "name": "ninja-release",
      "binaryDir": "${sourceDir}/build/${presetName}",
      "generator": "Ninja",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    }
  ]
}

然后运行以下操作:

cmake -S /path/to/source --preset=ninja-release

这将在/path/to/source/build/ninja发行版中使用ninja生成器生成一个构建目录,并且CMAKE_build_TYPE设置为release
如果您想查看可用预设的列表,可以运行:

cmake -S /path/to/source --list-presets

这将列出/path/to/source/CMakePresets.json/path/to_source/CMakeUsersPresets.json中可用的预设,而不生成构建树。

2. 在cmake gui中使用预设

如果项目有可用的预设,无论是通过CMakePresets.json还是CMakeUserPresets.json,预设列表都将出现在源目录和二进制目录之间的cmakegui中的下拉菜单中。选择预设会设置二进制目录、生成器、环境变量和缓存变量,但在选择预设后,所有这些选项都可以被覆盖。

五. 调用Buildsystem

生成构建系统后,可以通过调用特定的构建工具来构建软件。在IDE生成器的情况下,这可能涉及将生成的项目文件加载到IDE中以调用构建。
CMake知道调用构建所需的特定构建工具,因此通常,要在生成后从命令行构建构建系统或项目,可以在构建目录中调用以下命令:

cmake --build .

--build标志为cmake工具启用特定的操作模式。它调用与生成器或用户配置的构建工具关联的CMAKE_MAKE_PROGRAM命令。
--build模式还接受参数--target来指定要构建的特定目标,例如特定库、可执行文件或自定义目标,或特定的特殊目标(如install):

cmake --build . --target myexe

在多配置生成器的情况下,--build模式还接受--config参数,以指定要构建的特定配置:

cmake --build . --target myexe --config Release

如果生成器生成特定于配置的构建系统,则--config选项无效,该配置是在使用cmake_BUILD_TYPE变量调用cmake时选择的。
有些构建系统省略了在构建过程中调用的命令行的详细信息。--verbose标志可用于显示以下命令行:

cmake --build . --target myexe --verbose

--build模式还可以通过在--之后列出特定的命令行选项,将它们传递给底层构建工具。这对于为生成工具指定选项非常有用,例如在CMake不提供高级用户界面的作业失败后继续生成。
对于所有生成器,都可以在调用CMake之后运行底层构建工具。例如,make可以在用Unix Makefiles生成器生成后执行以调用构建,或者在用ninja生成器生成后使用ninja等执行。IDE构建系统通常提供用于构建也可以调用的项目的命令行工具。

1. 选择目标

CMake文件中描述的每个可执行文件和库都是一个构建目标,构建系统可以描述自定义目标,供内部使用,也可以供用户使用,例如创建文档。
CMake为所有提供CMake文件的构建系统提供了一些内置目标。

选项说明
allMakefile和Ninja生成器使用的默认目标。生成生成系统中的所有目标,但被其EXCLUDE_FROM_all目标属性或EXCLUDE-FROM_all目录属性排除的目标除外。名称ALL_BUILD用于Xcode和Visual Studio生成器的此目的。
help列出可用于生成的目标。当使用Unix Makefiles或Ninja生成器时,此目标可用,并且确切的输出是特定于工具的。
clean删除生成的对象文件和其他输出文件。基于Makefile的生成器为每个目录创建一个干净的目标,这样就可以清理单个目录。忍者工具提供了自己的细粒度-t清洁系统。
test运行测试。只有当CMake文件提供基于CTest的测试时,此目标才自动可用。另请参阅运行测试。
install安装软件。只有当软件使用install()命令定义安装规则时,此目标才自动可用。另请参阅软件安装。
package创建一个二进制包。只有当CMake文件提供基于CPack的包时,此目标才自动可用。
package_source创建源程序包。只有当CMake文件提供基于CPack的包时,此目标才自动可用。

2. 指定生成程序

生成器默认的生成程序可选项
XCodexcodebuild
Unix Makefilesmake
NMake Makefilesnmakejom
NMake Makefiles JOMjomnmake
MinGW Makefilesmingw32-make
MSYS Makefilesmake
Ninjaninja
Visual Studiomsbuild
Watcom WMakewmake

六. 软件安装

可以在CMAKE缓存中设置CMAKE_INSTALL_PREFIX变量,以指定安装所提供软件的位置。如果提供的软件具有使用install()命令指定的安装规则,则它们将把工件安装到该前缀中。在Windows上,默认安装位置对应于ProgramFiles系统目录,该目录可能是特定于体系结构的。在Unix主机上,/usr/local是默认的安装位置。CMAKE_INSTALL_PREFIX变量总是指目标文件系统上的安装前缀。在交叉编译或打包场景中,如果系统根是只读的,或者系统根应该保持原始状态,则可以将CMAKE_STAGING_PREFIX变量设置为实际安装文件的位置。
命令:

cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_SYSROOT=$HOME/root -DCMAKE_STAGING_PREFIX=/tmp/package
cmake --build .
cmake --build . --target install

导致文件被安装到主机上的路径,如/tmp/package/lib/libfoo.so。主机上的/usr/local位置不受影响。某些提供的软件可能会指定卸载规则,但CMake本身默认不会生成此类规则。

七. 运行测试

ctest工具随CMake发行版一起提供,用于执行所提供的测试并报告结果。测试构建目标用于运行所有可用的测试,但ctest工具允许对运行哪些测试、如何运行测试以及如何报告结果进行精细控制。在生成目录中执行ctest相当于运行测试目标:

ctest

可以传递正则表达式以仅运行与该表达式匹配的测试。要仅以Qt的名义运行测试,请执行以下操作:

ctest -R Qt

正则表达式也可以排除测试。要只运行名称中没有Qt的测试,请执行以下操作:

ctest -E Qt

通过将-j参数传递给ctest,可以并行运行测试:

ctest -R Qt -j8

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【五:(mock数据)springboot+mock集成swaggerConfig】

目录 1、springboot 的Demo2、实例类3、服务类 get请求方法4、服务类的post请求方法5、swaggerConfig 接口文档生成配置依赖 SpringBootApplication ComponentScan("com.course") public class Application {public static void main(String[] args) {SpringApplicat…

【TensorFlow1.X】系列学习笔记【基础一】

【TensorFlow1.X】系列学习笔记【基础一】 大量经典论文的算法均采用 TF 1.x 实现, 为了阅读方便, 同时加深对实现细节的理解, 需要 TF 1.x 的知识 文章目录 【TensorFlow1.X】系列学习笔记【基础一】前言线性回归非线性回归逻辑回归总结 前言 本篇博主将用最简洁的代码由浅入…

AD20原理图库的制作

1、打开“51单片机最小系统”的工程文件。 2、创建原理图库文件:单击“文件”菜单,选择“新的”选项中的“库”选项,再选择“原理图库”,进入原理图库元件的编辑界面。 3、保存原理图库文件:选择“文件”菜单&#xff…

antd vue 组件 使用下拉框的层级来显示后面的输入框

效果图&#xff1a; 代码&#xff1a; HTML: <dir><a-row><a-col :span"4"><a-form-model-item label"审批层级" ><a-selectplaceholder"请选择审批层级"v-model"form.PlatformPurchaseApproveLevel"cha…

安达发|人工智能在APS高级计划与排程中的应用

随着人工智能&#xff08;AI&#xff09;技术的发展&#xff0c;其在生产计划与排程&#xff08;APS&#xff09;领域的应用也日益广泛。APS是一种复杂的系统工程&#xff0c;它需要处理大量的数据&#xff0c;包括需求预测、资源优化、路径规划等。AI技术的应用可以帮助企业更…

身份证读卡器ubuntu虚拟机实现RK3399 Arm Linux开发板交叉编译libdonsee.so找不到libusb解决办法

昨天一个客户要在RK3399 Linux开发板上面使用身份证读卡器&#xff0c;由于没有客户的开发板&#xff0c;故只能用本机ubuntu虚拟机来交叉编译&#xff0c;用客户发过来的交叉编译工具&#xff0c;已经编译好libusb然后编译libdonsee.so的时候提示找不到libusb&#xff0c;报错…

语音芯片KT142C两种音频输出方式PWM和DAC的区别

目录 语音芯片KT142C两种音频输出方式PWM和DAC的区别 一般的语音芯片&#xff0c;输出方式&#xff0c;无外乎两种&#xff0c;即dac输出&#xff0c;或者PWM输出 其中dac的输出&#xff0c;一般应用场景都是外挂功放芯片&#xff0c;实现声音的放大&#xff0c;比如常用的音箱…

csapp-Machine-Level Representation of Program-review

Machine-Level Representation of Program收获和思考 Basics Machine-Level Programming可以看成是机器执行对于上层代码的一种翻译&#xff0c;即硬件是如何通过一个个的指令去解释每一行代码&#xff0c;然后操纵各种硬件执行出对应的结果。 Machine-Level Programming有2种…

Jprofiler V14中文使用文档

JProfiler介绍 什么是JProfiler? JProfiler是一个用于分析运行JVM内部情况的专业工具。 在开发中你可以使用它,用于质量保证,也可以解决你的生产系统遇到的问题。 JProfiler处理四个主要问题: 方法调用 这通常被称为"CPU分析"。方法调用可以通过不同的方式进行测…

【剑指Offer】33.二叉搜索树的后序遍历序列

题目 输入一个整数数组&#xff0c;判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回 true ,否则返回 false 。假设输入的数组的任意两个数字都互不相同。 数据范围&#xff1a; 节点数量 0≤n≤1000 &#xff0c;节点上的值满足 1≤val≤10^5 &#xff0c;保证节…

Xcode报错“compact unwind compressed function offset doesn‘t fit in 24 bits

Assertion failed: (false && “compact unwind compressed function offset doesn’t fit in 24 bits”), function operator(), file Layout.cpp, line 5758. 解决方案&#xff1a;targerts->build settings->other linker Flages增加-ld64

企业数据防泄密软件-文件外发管理,文件,文档,图纸不外泄

企业数据防泄密软件可以帮助保护企业的重要数据和知识产权&#xff0c;其中文件外发管理是一个重要的环节。 PC访问地址&#xff1a;https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是一些关键功能&#xff1a; 透明加密&#xff1a;加密软件…

【框架源码篇 01】Spring源码-手写IOC

Spring源码手写篇-手写IoC 一、IoC分析 1.Spring的核心 在Spring中非常核心的内容是 IOC和 AOP. 2.IoC的几个疑问? 2.1 IoC是什么&#xff1f; IoC:Inversion of Control 控制反转&#xff0c;简单理解就是&#xff1a;依赖对象的获得被反转了。 2.2 IoC有什么好处? IoC带…

浏览器的四种缓存协议

❤️浏览器缓存 在HTTP里所谓的缓存本质上只是浏览器和业务侧根据不同的报文字段做出不同的缓存动作而已 四种缓存协议如下 Cache-ControlExpiresETag/If-None-MatchLast-Modified/If-Modified-Since &#x1f3a1;Cache-Control 通过响应头设置Cache-Control和max-age&…

【必须安排】书单|1024程序员狂欢节充能书单!

注&#xff1a;以上书单可从京东商城优惠购买&#xff0c;点击以下链接进入图书专题&#xff01;1024程序员狂欢节充能书单 一年一度的1024程序员狂欢节又到啦&#xff01;成为更卓越的自己&#xff0c;坚持阅读和学习&#xff0c;别给自己留遗憾&#xff0c;行动起来吧&#x…

UniApp百度人脸识别插件YL-FaceDetect

插件地址&#xff1a;https://ext.dcloud.net.cn/plugin?id15061 插件说明&#xff1a; 百度离线人脸识别&#xff0c;人脸收集&#xff0c;属性&#xff08;性别年龄&#xff09;识别等&#xff0c;目前只支持安卓端&#xff01; 另&#xff1a;该插件支持的功能为属性识别…

win10下yolox tensorrt模型部署

TensorRT系列之 Win10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速部署…

51系列—基于51单片机的数字频率计(代码+文档资料)

本文主要说明基于51单片机的数字频率计设计&#xff0c;完整资料见文末链接 数字频率计概述 数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。它是一种用十进制数字显示被测信号频率的数字测量仪器。它的基本功能是测量正弦信号&#xff0c;方波信…

安达发|AI在APS生产计划排程系统中的应用与优势

随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;已经在许多领域取得了显著的成果。在生产管理计划系统中&#xff0c;AI技术的应用也日益受到关注。本文将探讨如何将AI人工智能用在生产管理计划系统上&#xff0c;以提高生产效率、降低成本并优化资源配置。…

Qt之使用bitblt抓取bitmap(位图)并转QImage

一.效果 点击按钮抓取窗口自身并显示到QLable中 二.实现 pro文件 QT += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.uiLIBS += -lgdi32 -luser32 -l…