CMake学习笔记

打印 上一主题 下一主题

主题 1387|帖子 1387|积分 4161

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我参考的教程视频:【现代C++: CMake简明教程】 https://www.bilibili.com/video/BV1xa4y1R7vT/?p=17&share_source=copy_web&vd_source=8ad424dfb8b17f7477da296c84de01be
CMake构建项目的简单示例

该部分通过一个简单的CMakeLists.txt演示如何构建项目.其中用到的大多数指令可以在下面的CMake常用操纵中找到.
  1. #要构建一个项目需要以下几步:指明可执行文件名/库名,指明可执行文件/库所需要的头文件和源文件,链接外部库文件.而链接外部库文件需要指明库的头文件路径,库的库文件路径,库的名字.下面的代码就依次完成了这些步骤
  2. cmake_minimum_required(VERSION 3.20)
  3. #指明cmake所需的最小版本
  4. project(hello)
  5. #指明项目名
  6. file(GLOB src ${PROJECT_SOURCE_DIR}/src/*.cpp)
  7. #将项目源文件路径保存在变量src中(见CMake常用命令-file())
  8. add_executable(nptest ${src})
  9. #指明目标(该目标为可执行文件,省略后缀)和所用的源文件(由上文file()命令取得)
  10. target_include_directories(nptest PRIVATE
  11.     D:/tools/npcap-sdk-1.15/Include
  12.     ${PROJECT_SOURCE_DIR}/include
  13. )
  14. #指明头文件所在路径(若和CMakeLists.txt或源文件位于同一路径则该路径可以省略)
  15. target_link_directories(nptest PRIVATE D:\\tools\\npcap-sdk-1.15\\Lib\\x64)
  16. #指明外部库文件所在路径
  17. target_link_libraries(nptest PRIVATE wpcap Packet)
  18. #将外部库文件链接到目标nptest
复制代码
CMake 一些紧张概念


  • target: 构建系统中的一个目标,指可执行文件或库.目标通过add_executive()指令或者add_library()指令指明,前者生成一个可执行文件,后者生成库文件.很多命令包含target字眼,指的是该指令对指定目标生效.比如target_include_directories()指令,在构建指定目标时在该目次寻找头文件,构建其他目标时不寻找该目次.对应的去掉target的include_directories()命令指明所有目标都使用的路径.(发起使用带target的指令)
  • PUBLIC|PRIVATE|INTERFACE 访问控制参数.在一些指令中必要.PUBLIC指该指令对指定目标和依赖于该目标的其他目标都生效.PRIVATE指该指令只对给定目标生效,INTERFACE指该指令对给定目标不生效,对依赖于该目标的其他目标生效
  • 依赖: 依赖关系是指一个目标(如可执行文件或库)对其他目标或库的依赖.例如通过target_link_libraries()将一个库链接到一个目标,则该目标依赖于库
cmake变量操纵


  • 创建变量: `set(   ...)

    • set命令可以给一个变量赋予多个值.内部存储时会将各个值中间用分号隔开.但是取值的时候会拼接在一起.
    • 取消变量可以使用unset() 使用后变量被撤销,不能再取值
    • 变量取值方法{}

  • 变量列表操纵:list(  ...)

    • 给一个变量赋多个值后这个变量就是一个列表.可以进行很多列表上的操纵例如查找/排序/倒序/插入/删除等
    • 变量查找: list(FIND   ) 列表操纵类型为FIND.对名为varname的列表进行查找,查找值为findContent的元素,返回元素的索引(从0开始) 将该索引保存在index中.
    • 列表添加元素: list(APPEND    ...) 列表操纵类型为APPEND,将val1,val2等等元素按序添加到varname变量的末端.该方法也可以用来创建列表.当varname变量不存在时会创建一个
    • 列表删除元素: list(REMOVE_ITEM   ..) 列表操纵类型为REMOVE_ITEM,从列表varname中删除value1,value2等元素
    • 列表插入元素: list(INSERT    ..) 列表操纵类型为INSERT.在列表varname中下标index位置插入value1 value2等元素
    • 获取列表元素个数: list(LENGTH  ) 列表操纵类型为LENGTH.获取列表varname中元素个数,保存在变量output中
    • 列表排序: list(SORT ) 列表操纵类型为SORT.对列表中的元素进行排序
    • 列表反转: list(REVERSE ) 反转列表元素

cmake流程控制
  1. cmake_minimum_required(VERSION 3.20)
  2. #if的用法 if(<condition>)其中condition值为true或false.可以通过NOT取反,通过AND和OR进行多条件判断,通过LESS和EQUAL进行比较(字符串比较)
  3. if(<condition>)
  4.         #指令
  5. endif()
  6. #for的几种常用用法
  7. #foreach循环支持break()和continue()流程控制
  8. #1.foreach(<var> RANGE <range>)
  9. # endforeach() var将会进行从0到<range>跨步为1的循环
  10. foreach(index RANGE 3)
  11.     message(${index})
  12. endforeach()
  13. #输出0 1 2 3(中间是回车)
  14. message(-------------------)
  15. set(myList a1 a2 a3)
  16. #2.foreach(<var> IN LISTS <list> [ITEMS <temp1> <temp2>...])
  17. #该语法每次循环遍历list中与个元素保存在var中.遍历完再遍历ITEMS后面给的各个元素
  18. foreach(var IN LISTS myList ITEMS a4 a5 a6)
  19.     message(${var})
  20. endforeach()
  21. #将会输出a1 a2 a3 a4 a5 a6
  22. message(--------------------)
  23. set(alab 1 2 3)
  24. set(equa = = =)
  25. set(eng one two three)
  26. #3.foreach(<var> IN ZIP_LISTS <list1> <list2>...)
  27. #该语法每次同时遍历list1,list2... 各个list取一个元素保存在var中.通过var_0 var_1..来访问
  28. foreach(pair IN ZIP_LISTS alab equa eng)
  29.     message(${pair_0}${pair_1}${pair_2})
  30. endforeach()
  31. #将会输出1=one 2=two 3=three
复制代码
CMake函数

函数定义:
  1. function(<funcName> <arg1> <arg2>...)
  2. #funcName:函数名称.后面跟的是可选的多个参数名
  3. #函数体写在function()和endfunction()中间
  4. #函数内提供的多个变量及其含义:
  5. #CMAKE_CURRENT_FUNCTION:当前函数的函数名.
  6. #ARGVx:第x个参数(下标从0开始)
  7. endfunction()
复制代码
函数调用:
  1. funcName(<arg1> <arg2>...)
  2. #函数调用时传参如果要传变量,需要使用${var}.如果直接传入var则会被当做字符串"var"
  3. #由于传参只是传入了值,因此传入的变量值不会被改变,在函数中改变值只是改变了"形参"的值,对函数外并无影响
复制代码
函数作用域: 在函数外定义的变量,可以在函数内使用.但是函数内修改了变量值只在函数内生效.函数退出后就会失效.
[code]function(OutFunc)        message(->OutFunc{var})#2.执行这句.var继承自global,var=3        set(var 2)        InFunc()        message(InFunc{var})#3.执行这句.var继承自OutFunc,var=2        set(var 1)        message(global{var})#1.执行这句 var=3OutFunc()message(
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表