cmake 学习笔记(四)

接前面的一二三,学习一下 CMakeCache.txt 相关的东西。

CMakeCache.txt

可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数)。

  • CMakeLists.txt 中通过 set(... CACHE ...) 设置的变量
  • CMakeLists.txt 中的 option() 提供的选项
  • CMakeLists.txt 中find_package() 等find命令引入变量
  • 命令行 cmake . -D <var>:<type>=<value> 定义变量

cmake 第一次运行时将生成 CMakeCache.txt 文件,我们可以通过ccmake或cmake-gui或make edit_cache对其进行编辑。

对应于命令行 -D 定义变量,-U 用来删除变量(支持globbing_expr),比如 cmake -U/*QT/* 将删除所有名字中带有QT的cache项。

变量与Cache

cmake 的变量系统远比第一眼看上去复杂:

  • 有些变量被cache,有些则不被cache
  • 被cache的变量
    • 有的不能通过ccmake等进行编辑(internal)
    • 有的(带有描述和类型)可以被编辑(external)
      • 有的只在ccmake的 advanced 模式出现

看个例子:

  • SET(var1 13)

    • 变量 var1 被设置成 13
    • 如果 var1 在cache中已经存在,该命令不会overwrite cache中的值
  • SET(var1 13 ... CACHE ...)
    • 如果cache存在该变量,使用cache中变量
    • 如果cache中不存在,将该值写入cache
  • SET(var1 13 ... CACHE ... FORCE)
    • 不论cache中是否存在,始终使用该值

要习惯用帮助

cmake --help-command SET

find_xxx

为了避免每次运行都要进行头文件和库文件的探测,以及考虑到允许用户通过ccmake设置头文件路径和库文件的重要性,这些东西必须进行cache。

  • find_path 和 find_library 会自动cache他们的变量,如果变量已经存在且是一个有效值(即不是 -NOTFOUND 或 undefined),他们将什么都不做。
  • 另一方面,模块查找时输出的变量(<name>_FOUND,<name>_INCLUDE_DIRS,<name>_LIBRARIES)不应该被cache

参考

时间: 2024-11-29 18:56:10

cmake 学习笔记(四)的相关文章

cmake学习笔记(五)

在cmake 学习笔记(三) 中简单学习了 find_package 的 model 模式,在cmake 学习笔记(四)中了解一个CMakeCache相关的东西.但靠这些知识还是不能看懂PySide使用CMakeLists文件,接下来继续学习find_package的 config 模式及package configure文件相关知识 find_package 的 config 模式 当CMakeLists.txt中使用find_package命令时,首先启用的是 module 模式: 按照 C

kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://koumm.blog.51cto.com/703525/1290269 KVM虚拟化学习笔记系列文章列表 ---------------------------------------- kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51cto.com/703525/1288795 kvm虚拟化学习笔记(二)之linux kvm虚拟机安装 h

cmake 学习笔记(三)

转自:http://blog.csdn.net/dbzhang800/article/details/6329314 接前面的 Cmake学习笔记(一) 与 Cmake学习笔记(二) 继续学习 cmake 的使用. 学习一下cmake的 finder. finder是神马东西? 当编译一个需要使用第三方库的软件时,我们需要知道: 去哪儿找头文件 .h 对比GCC的 -I 参数 去哪儿找库文件 (.so/.dll/.lib/.dylib/...) 对比GCC的 -L 参数 需要链接的库文件的名字

cmake 学习笔记(二)

在 Cmake学习笔记一 中通过一串小例子简单学习了cmake 的使用方式. 这次应该简单看看语法和常用的命令了. 简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) 字符串列表 A;B;C # 分号分割或空格分隔的值 变量(字符串或字符串列表) set(Foo a b c) 设置变量 Foo command(${Foo}) 等价于 command(a b c) command("${Foo}") 等价于 command("a b c"

Sqlite学习笔记(四)&amp;&amp;SQLite-WAL原理(转)

Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是什么       WAL(Write ahead logging)是一种日志模式,它是一种思想,普遍应用于关系型数据库.每个事务执行变更时,修改数据页,同时会产生日志,这样在事务提交后,不需要将修改的脏页刷盘,只需要将事务产生的日志落盘即可返回.WAL保证日志一定先于对应的脏页落盘,就是所谓的WAL.SQLI

Caliburn.Micro学习笔记(四)----IHandle&lt;T&gt;实现多语言功能

Caliburn.Micro学习笔记目录 说一下IHandle<T>实现多语言功能 因为Caliburn.Micro是基于MvvM的UI与codebehind分离, binding可以是双向的所以我们想动态的实现多语言切换很是方便今天我做一个小demo给大家提供一个思路 先看一下效果                                           点击英文  变成英文状态点chinese就会变成中文                         源码的下载地址在文章的最下

cmake 学习笔记(一)

最大的Qt4程序群(KDE4)采用cmake作为构建系统 Qt4的python绑定(pyside)采用了cmake作为构建系统 开源的图像处理库 opencv 采用cmake 作为构建系统 ... 看来不学习一下cmake是不行了,一点一点来吧,找个最简单的C程序,慢慢复杂化,试试看: 例子一 单个源文件 main.c 例子二 ==>分解成多个 main.c hello.h hello.c 例子三 ==>先生成一个静态库,链接该库 例子四 ==>将源文件放置到不同的目录 例子五 ==&g

JSP学习笔记(四)-----JSP动作的使用

js|笔记 1. 该实例主要告诉我们怎么样在JSP代码中使用JSP动作,例如<jsp:forward >2. 该实例需要四个文件:login.jsp,test.jsp,ok.htm,no.htm3. 首先看一下login.jsp<html><center><form method=get action="http://127.0.0.1:8000/test.jsp">username<input type=text name=use

cmake 学习笔记(六)

希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest. 简单使用 最简单的使用ctest的方法,就是在 CMakeLists.txt 添加命令: enable_testing() 该命令需要在源码的根目录文件内. 从这一刻起,就可以在工程中添加add_test命令了 add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]] [WORKING_DIR