cmakelists实操记录

2023-11-14

cmake 工具要领


主要工具逻辑

查看帮助

cmake --help-command

cmake set 定义变量后, 可以跟多个表达式, 来说明变量有多个数据段

set(QC_INCLUDE ${QC_INCLUDE} ${QC_SYSROOT}/usr/include/amss)
set(QC_INCLUDE ${QC_INCLUDE} ${QC_SYSROOT}/usr/include/amss/core)

检查环境变量中是否有某个值

Check environment variables
if ("$ENV{QNX_HOST}" STREQUAL “”)

CMakeCache.txt 干嘛用的

可以将其想象成一个配置文件(在Unix环境下,我们可以认为它等价于传递给configure的参数)。
cmake 第一次运行时将生成 CMakeCache.txt 文件,我们可以通过ccmake或cmake-gui或make edit_cache对其进行编辑。
主要记录如下途径得到的变量:

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

对应于命令行 -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中是否存在,始终使用该值

具体招式

find_xxx

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

find_path 和 find_library 会自动cache他们的变量,如果变量已经存在且是一个有效值(即不是 -NOTFOUND 或 undefined),他们将什么都不做。

另一方面,模块查找时输出的变量(_FOUND,_INCLUDE_DIRS,_LIBRARIES)不应该被cache

连续定义project

一个cmake中开多个project, 连续定义多个工程和参数,编译多个目标

file GLOB_RECURSE

递归查找文件, 可以避免丑陋的子目录塞入CMakeList的问题。

cmake 复制文件方法

  • file COPY

    file(<COPY|INSTALL> <files>... DESTINATION <dir>
        [FILE_PERMISSIONS <permissions>...]
        [DIRECTORY_PERMISSIONS <permissions>...]
        [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
        [FOLLOW_SYMLINK_CHAIN]
        [FILES_MATCHING]
        [[PATTERN <pattern> | REGEX <regex>]
        [EXCLUDE] [PERMISSIONS <permissions>...]] [...])

COPY将文件,目录和符号链接复制到目标文件夹。相对于当前源目录评估相对输入路径,相对于当前构建目录评估相对目的地。复制会保留输入文件的时间戳,并优化文件(如果该文件存在于具有相同时间戳的目标文件中)。复制将保留输入权限,除非给出明确的权限或NO_SOURCE_PERMISSIONS(默认为USE_SOURCE_PERMISSIONS)。

如果指定了FOLLOW_SYMLINK_CHAIN,则COPY将在给定的路径上递归解析符号链接,直到找到真实文件为止,然后在目标位置为遇到的每个符号链接安装相应的符号链接。

  • ADD_CUSTOM_COMMAND

add_custom_command:

该命令可以为生成的构建系统添加一条自定义的构建规则。这里又包含两种使用方式,一种是通过自定义命令在构建中生成输出文件,另外一种是向构建目标添加自定义命令。命令格式分别为:

add_custom_command(OUTPUT output1 [output2 ...]
                   COMMAND command1 [ARGS] [args1...]
                   [COMMAND command2 [ARGS] [args2...] ...]
                   [MAIN_DEPENDENCY depend]
                   [DEPENDS [depends...]]
                   [BYPRODUCTS [files...]]
                   [IMPLICIT_DEPENDS <lang1> depend1
                                    [<lang2> depend2] ...]
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment]
                   [DEPFILE depfile]
                   [JOB_POOL job_pool]
                   [VERBATIM] [APPEND] [USES_TERMINAL]
                   [COMMAND_EXPAND_LISTS])

下面命令中,TARGET是在本工程中会被执行的目标,可以是 executable, 也可以是 shared library. 需要制定对应的名字。

add_custom_command(TARGET <target>
                   PRE_BUILD | PRE_LINK | POST_BUILD
                   COMMAND command1 [ARGS] [args1...]
                   [COMMAND command2 [ARGS] [args2...] ...]
                   [BYPRODUCTS [files...]]
                   [WORKING_DIRECTORY dir]
                   [COMMENT comment]
                   [VERBATIM] [USES_TERMINAL])

  • ADD_CUSTOM_TARGET
    该命令可以给指定名称的目标执行指定的命令,该目标没有输出文件,并始终被构建。命令的格式为:
add_custom_target(Name [ALL] [command1 [args1...]]
                  [COMMAND command2 [args2...] ...]
                  [DEPENDS depend depend depend ... ]
                  [BYPRODUCTS [files...]]
                  [WORKING_DIRECTORY dir]
                  [COMMENT comment]
                  [JOB_POOL job_pool]
                  [VERBATIM] [USES_TERMINAL]
                  [COMMAND_EXPAND_LISTS]
                  [SOURCES src1 [src2...]])

add_definitions()

为源文件的编译添加由-D定义的标志。

cmake使用的变量

通过如下
cmake --help-commond-list
可以查看所有的变量

CMAKE_C_COMPILER
CMAKE_C_COMPILER_TARGET
CMAKE_CXX_COMPILER
CMAKE_CXX_COMPILER_TARGET
CMAKE_ASM_COMPILER
CMAKE_ASM_DEFINE_FLAG
CMAKE_LINKER
CMAKE_AR
CMAKE_NM
CMAKE_OBJCOPY
CMAKE_OBJDUMP
CMAKE_RANLIB
CMAKE_STRIP
CMAKE_SH

编译so的时候不会进行link

在编译so的时候,虽然有用到其他so中的接口,但只要有头文件就可以,不需要link so。

使用CMAKE_TOOLCHAIN_FILE命令

cmake -DCMAKE_BUILD_TYPE=Release \
      -DCMAKE_TOOLCHAIN_FILE=/path/to/driveworks/samples/cmake/Toolchain-V5L.cmake \
      -DVIBRANTE_PDK:STRING=/path/to/drive-t186ref-linux \
       /path/to/driveworks/samples/folder

常用命令收藏


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

cmakelists实操记录 的相关文章

  • D语言介绍

    D 语言是一种通用的系统和应用编程语言 它是比 C 更高级的语言 同时还保持了生成高效代码以及直接访问操作系统API和硬件的能力 D 很适合于编写从中等规模到那些由团队合作完成 数百万行代码规模的各种程序 D 易于学习 为编程者提供了很多便
  • Java:进化的尽头

    Java Evolutionary Dead End January 3 2008 我在比利时安特卫普举办的Javapolis大会上刚做完一个主题演讲 现在是周五早上 前一天Josh Bloch作了发言 谈到了在closures 闭包 建议
  • Java语言 设计一个动物声音“模拟器”(用接口实现)

    设计一个动物声音 模拟器 希望模拟器可以模拟许多动物的叫声 要求如下 编写接口Animal Animal接口有两个抽象方法cry 和getAnimalName 即要求实现该接口的各种具体的动物类给出自己的叫声和种类名称 编写模拟器类Simu
  • 大题---砝码称重(贪心算法)

    5个砝码 用天平称重时 我们希望用尽可能少的砝码组合称出尽可能多的重量 如果只有5个砝码 重量分别是1 3 9 27 81 则它们可以组合称出1到121之间任意整数重量 砝码允许放在左右两个盘中 本题目要求编程实现 对用户给定的重量 给出砝
  • C语言深入学习--checklist7:链接、运行时数据结构、申明

    1 你知道段的概念吗 段是二进制文件中的简单区域 里面保存了某种特定的类型 如符号表条目 相关的所有信息 1 可执行程序分为几个段 每个段保存什么内容 可执行程序分为三个段 BSS段 数据段 文本段 BSS段 Block Started b
  • ASCII码详解

    ASCII码表 ASCII码大致可以分作三部分組成 第一部分是 ASCII非打印控制字符 第二部分是 ASCII打印字符 第三部分是 扩展ASCII打印字符 第一部分 ASCII非打印控制字符表 ASCII表上的数字0 31分配给了控制字符
  • 点在多边形内的判断

    c语言代码 typedef struct tagVERTEX double x double y VERTEX 判断点与多边形关系 0 外 1 上 2 内int PointInPolygon VERTEX pt VERTEX vtx int
  • 《java与模式》笔记(二) 开闭原则

    4 1 什么是开闭原则 开闭原则指的是一个软件实体应对对扩展开发 对修改关闭 Software entities should be open for extension but closed for modification 这个原则是说
  • c语言写了一个简单的正弦波函数

    转载自 http blog csdn net qiongguishanglu article details 5874251 include
  • 指针以及内存分配

    1 指针很灵活 这使得指针很难管理 在定义指针时 将在栈中开辟一块内存存放指针的地址 栈内的内存由系统分配和释放 指针的地址内存只是存放指针的地址 不存放指针指向的数据 值得注意的是 定义指针时指针会随机指向一块内存 如int p p会指向
  • 深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别

    看来基础还是很重要的 基础不扎实就难以学好c语言 就别说写出高质量的c语言代码了 今天 我就被这个问题折磨的不行了 哈哈 不过现在终于明白了 0 0 0 之间的区别了 困惑和快乐与你分享 首先比较一下 0 和 0 的区别 有一个共同点就是它
  • 逻辑地址、物理地址和线性地址

    逻辑地址 logical address 包含在机器语言指令中用来指定一个操作数或一条指令的地址 这种寻址方式在80X86著名的分段结构中表现的尤为具体 它促使MS DOS或Windows程序员把程序分成若干段 每一个逻辑地址都由一个段 s
  • 2012腾讯校园招聘笔试成都站回忆版

    腾讯的笔试题目比较基础 具体的题目记不清除了 设计到的知识点 1 c语言基础 sizeof strlen的用法 2 linux基本命令umask 3 SQL语言 4 数据结构的知识 建立二叉树 顺序表操作的复杂度 5 操作系统的知识 通过页
  • bnu1331 赈灾捐款 C语言版

    北京师范大学珠海分校 Judge Online of ACM ICPC 1331 赈灾捐款 C语言版 include
  • 封装0603和0805的区别

    封装尺寸是长x宽 0603 0805 这些单位是英寸 0603代表0 6英寸x0 3英寸 1英寸 25 4毫米 区别 一 体积大小不同 0805和0603的公制尺寸分别是2 0 1 2mm 1 6 0 8mm 所以两者的体积大小不同 二 电
  • 英语学习对程序员得重要性!

    程序世界的主导语言是英文 编写程序时使用的开发文档和开发工具的帮助文件离不开英文 了解业界的最新动向 阅读技术文章离不开英文 同世界各地编程高手往往也离不开英文 提高英文水平 能大大促进一个程序员的发展 让你有更多的资源 在此 个人总结了几
  • Bicubic Interpolation (双三次插值)

    在Wikipedia http en wikipedia org wiki Bicubic interpolation 上找到了bicubic的描述 不过它只给出了知道导数情况下的公式 后来在CSDN上找到了C语言的算法描述 http to
  • 一个不错的关于CPU和GPU(CUDA)的性能比较讨论话题

    http topic csdn net u 20081027 23 67ff3857 3c71 4d5c acf6 095f3497c7a9 html这里是今天的一个论坛的一个帖子 大家可以讨论一下 1 那些程序适合用cpu来做 那些适合用
  • C++标准库头文件(工具库->cstdarg)

    参考网址 https zh cppreference com w cpp header https www runoob com cplusplus cpp standard library html 工具库 cstdarg 类型 std
  • hdu2030 汉字统计

    hdu2030 汉字统计 Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 4080 Accepted

随机推荐