当前位置:网站首页 > 云服务教程 > 正文

cmake多级目录(cmake教程 多层目录)



前言:

学习笔记,随时更新。如有谬误,欢迎指正。


说明:

  1. 红色字体为较为重要部分。
  2. 绿色字体为个人理解部分。

CMake 缓存可以被认为是一个配置文件。当 CMake 第一次在一个项目上运行时,它会在构建树的顶部目录中生成一个 CMakeCache.txt 文件。CMake 使用这个文件来存储一组全局缓存变量,这些变量的值在对项目构建树的多次运行(构建)中持续存在(也就是说构建过一次项目之后,只要构建出来的项目文件不被删除,或者精确来说就是 CMakeCache.txt 文件不被删除,这些缓存的值是不会发生改变的。所以如果有缓存需要更新,最好删除所有生成的项目文件,再全部重新生成一次。)。

缓存有几个目的。第一是存储用户的选择,以至于当他们需要再次运行 CMake 时候,并不需要重新输入这些信息。例如, option 命令会创建一个布尔变量,并存储到缓存

 
    

上面的一行将会创建名为 USE_JPEG 的变量并放入缓存。这样用户可以通过用户界面来设置那个变量,并且它的值将会保留下来以防用户在未来再次运行 CMake 。为了在缓存中创建变量,可以使用命令如 option 、 find_file ,或者你可以使用标准的 set 命令并携带 CACHE 选项

 
    

当你使用 CACHE 选项时,你必须提供变量类型和一个说明字符串。变量类型会被 cmake-gui 用来控制如何展示和设置该变量,但是(变量的)值总是作为字符串存储在缓存文件中的。

缓存的另一个目的是允许 CMake 自己在 CMake 运行之间持久地存储值。这些变量可能无法被用户见到或者修改。典型地,这些值是系统相关的变量,这些变量需要 CMake 编译并执行一个程序来决定它的值。一旦这些值被确定后,他们被存储在缓存中来避免每次运行 CMake 都要重新计算。一般情况下 CMake 试图将这些变量限制为从不应该被更改的属性(例如你所在机器的字节序)。如果你对你的电脑做了重大改动,不管是更换了操作系统或者是换到另一台电脑上,你将需要删除缓存文件(甚至是二进制树中所有的对象文件、库和可执行文件)

有些项目非常复杂,在缓存中设置一个值可能会导致下次构建缓存时出现一些新的选项。例如, VTK 支持使用 MPI 进行分布式计算。这需要构建程序确定 MPI 库和头文件的位置,并允许用户调整它们的值。但是 MPI 只有在 VTK 中另一个选项VTK_USE_PARALLEL 打开时才可用。因此,为了避免那些不知道 MPI 是什么的人感到困惑,这些选项被隐藏,直到 VTK_USE_PARALLEL 被打开。所以 CMake 在缓存区显示 VTK_USE_PARALLEL 选项,如果用户打开并重新配置 CMake ,新的 MPI 选项将出现,他们就可以进行设置。这个规则是不断地构建缓存,直到它没有变化。对于大多数项目来说,这只需要一次(构建)。对于一些复杂的问题,它可能需要两次或更多次(构建)。

你可能想直接编辑缓存文件,或者通过给它一个预填充的 CMakeCache.txt 文件来“初始化”一个项目。但这可能不起作用,并可能在将来导致其他问题。首先, CMake 缓存的语法可能会改变。其次,缓存文件包含了一些完整路径,这使得它们不适合在二进制树之间移动

一旦一个变量在缓存中,这个缓存的值就无法正常地从 CMakeLists 文件中进行修改。这背后的原因是一旦 CMake 将带有初值的变量放入缓存中,用户就可能从 GUI 中修改它的值。如果下次的 CMake 调用将们的更改覆盖回 set (命令设置)的值,则用户将永远无法进行不会 CMake 覆盖的更改(这段的意思应该是用户在界面上可能会调整缓存的值,如果在 CMakeLists 的代码里随意能修改缓存的值,那么用户界面设置的值就会被之后随意的一次 CMake 运行中代码里的设置操作给覆盖了)。因此 set(FOO ON CACHE BOOL “doc”) 命令仅会在缓存中没有这个变量的情况下做一些事情。一旦变量已在缓存中,这个命令将没有任何效果

在某些极少数情况下,你确实想要修改缓存值,你可以使用 set 命令并联合 FORCE 选项使用 CACHE 选项。 FORCE 选项将导致 set 命令覆盖并改变缓存变量的值

关于变量和它们与缓存的交互,还有几点需要提出。如果一个变量在缓存中,它仍然可以在 CMakeLists 文件中被不带 CACHE 选项的 set 命令所重写。仅仅在当前范围中没有定义被引用的变量时,才会去检查缓存值。 set 命令将为当前作用域定义一个变量,而不会改变缓存值。

 
    

缓存中的变量也有一个属性用来表明它们是否是高级的。在默认情况下,当 ccmake 或 cmake-gui 运行时,高级缓存项是不会显式的。这样用户就能专注于他们需要考虑进行变更的缓存项。高级缓存项是用户可以修改但通常不会修改的其他选项。一个大型的软件工程很少有超过 50 个选项的,高级属性可以让软件项目划分这些选项为大部分用户所使用的关键选项和高级用户所使用的高级选项。根据项目的不同,可能没有任何非高级缓存项。使用 mark_as_advanced 命令来设置高级缓存项,需要传入变量(亦称为缓存项)的名称。

某些情况下,你可能想要限制缓存项(的值)在一些预定义的选项中。你可以对缓存项设置 STRING 属性来达到目的。下面的 CMakelLists 阐明了这种情况,正常地创建了一个名为 CRYPTOBACKEND 的属性,然后对它的 STRING 属性设置了三个选项。

 
    

当 cmake-gui 运行并且用户选择了 CRYPTOBACKEND 缓存项,将会展示出一个下拉框来选择他们想要的选项。

有些时候你需要在不运行 GUI 的情况下设置缓存项。这在设置夜间指示板或者在想用同样的缓存值创建许多构建树时非常常见。在这些情况下 CMake 缓存可以通过两种方式初始化。第一种方式是在命令行中使用 -DCACHE_VAR:TYPE=VALUE 参数传入缓存值。例如,请看下面的 UNIX 机器上的夜间指示板脚本:

 
    

同样的想法可以用于 Windows 上的批处理文件。

第二个方法是创建一个文件,然后使用 cmake 的 -C 选项加载它。相比于通过 -D 选项设置缓存,这种情况下是使用一个可以被 CMake 解析的文件来达到同样目的。这个文件的语法是 CMakeLists 的标准语法,并且(文件里)通常是一系列的 set 命令,例如:

 
    

某些情况下,可能某个缓存(项)已存在,你某种程度上想要强行设置缓存(项的)值。例如就算用户之前运行了 CMake 并且把 Hybrid 关闭了,你还是想要把 Hybrid 打开。你可以这样做(若不使用FORCE参数,则已存在于缓存的变量值不会被修改):

 
    

还有另一个选项,你想要设置选项后隐藏它以至于用户后面无法(对该选项)调整进行。这可以使用 INTERNAL 来实现。 INTERNAL 缓存变量暗含着 FORCE ,并且永远不会在缓存编辑器中显示。

到此这篇cmake多级目录(cmake教程 多层目录)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就! 
   
  
  

                            

版权声明


相关文章:

  • mac装双系统win10详细教程(mac装双系统win10怎么样)2025-08-09 16:09:11
  • awvs使用教程kali(awvs安装教程)2025-08-09 16:09:11
  • bs4库使用(bs4库使用教程)2025-08-09 16:09:11
  • esp8266天气时钟教程(esp8266 oled天气)2025-08-09 16:09:11
  • 程序员代码教程(程序员码代码叫什么)2025-08-09 16:09:11
  • 制作u盘启动盘全部步骤图片(怎样制作u盘启动盘的新手教程)2025-08-09 16:09:11
  • xmouse设置不了中文(xmouse设置教程)2025-08-09 16:09:11
  • awvs12使用教程(awvs13使用教程)2025-08-09 16:09:11
  • git教程详解(git简易教程)2025-08-09 16:09:11
  • 程序员入门教程电子版(程序员入门教程电子版下载)2025-08-09 16:09:11
  • 全屏图片