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常用操纵中找到.
#要构建一个项目需要以下几步:指明可执行文件名/库名,指明可执行文件/库所需要的头文件和源文件,链接外部库文件.而链接外部库文件需要指明库的头文件路径,库的库文件路径,库的名字.下面的代码就依次完成了这些步骤
cmake_minimum_required(VERSION 3.20)
#指明cmake所需的最小版本
project(hello)
#指明项目名
file(GLOB src ${PROJECT_SOURCE_DIR}/src/*.cpp)
#将项目源文件路径保存在变量src中(见CMake常用命令-file())
add_executable(nptest ${src})
#指明目标(该目标为可执行文件,省略后缀)和所用的源文件(由上文file()命令取得)
target_include_directories(nptest PRIVATE
D:/tools/npcap-sdk-1.15/Include
${PROJECT_SOURCE_DIR}/include
)
#指明头文件所在路径(若和CMakeLists.txt或源文件位于同一路径则该路径可以省略)
target_link_directories(nptest PRIVATE D:\\tools\\npcap-sdk-1.15\\Lib\\x64)
#指明外部库文件所在路径
target_link_libraries(nptest PRIVATE wpcap Packet)
#将外部库文件链接到目标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流程控制
cmake_minimum_required(VERSION 3.20)
#if的用法 if(<condition>)其中condition值为true或false.可以通过NOT取反,通过AND和OR进行多条件判断,通过LESS和EQUAL进行比较(字符串比较)
if(<condition>)
#指令
endif()
#for的几种常用用法
#foreach循环支持break()和continue()流程控制
#1.foreach(<var> RANGE <range>)
# endforeach() var将会进行从0到<range>跨步为1的循环
foreach(index RANGE 3)
message(${index})
endforeach()
#输出0 1 2 3(中间是回车)
message(-------------------)
set(myList a1 a2 a3)
#2.foreach(<var> IN LISTS <list> [ITEMS <temp1> <temp2>...])
#该语法每次循环遍历list中与个元素保存在var中.遍历完再遍历ITEMS后面给的各个元素
foreach(var IN LISTS myList ITEMS a4 a5 a6)
message(${var})
endforeach()
#将会输出a1 a2 a3 a4 a5 a6
message(--------------------)
set(alab 1 2 3)
set(equa = = =)
set(eng one two three)
#3.foreach(<var> IN ZIP_LISTS <list1> <list2>...)
#该语法每次同时遍历list1,list2... 各个list取一个元素保存在var中.通过var_0 var_1..来访问
foreach(pair IN ZIP_LISTS alab equa eng)
message(${pair_0}${pair_1}${pair_2})
endforeach()
#将会输出1=one 2=two 3=three
复制代码
CMake函数
函数定义:
function(<funcName> <arg1> <arg2>...)
#funcName:函数名称.后面跟的是可选的多个参数名
#函数体写在function()和endfunction()中间
#函数内提供的多个变量及其含义:
#CMAKE_CURRENT_FUNCTION:当前函数的函数名.
#ARGVx:第x个参数(下标从0开始)
endfunction()
复制代码
函数调用:
funcName(<arg1> <arg2>...)
#函数调用时传参如果要传变量,需要使用${var}.如果直接传入var则会被当做字符串"var"
#由于传参只是传入了值,因此传入的变量值不会被改变,在函数中改变值只是改变了"形参"的值,对函数外并无影响
复制代码
函数作用域:
在函数外定义的变量,可以在函数内使用.但是函数内修改了变量值只在函数内生效.函数退出后就会失效.
[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