IT评测·应用市场-qidao123.com技术社区

标题: CMake学习笔记 [打印本页]

作者: 小小小幸运    时间: 2025-4-7 12:13
标题: CMake学习笔记
我参考的教程视频:【现代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 一些紧张概念

cmake变量操纵

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(




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4