From ad2ac5a8a28db9483b43848083ec99a40357bbf8 Mon Sep 17 00:00:00 2001 From: LiXiaoqi <2360211477.com> Date: Sat, 9 Nov 2024 14:02:00 +0800 Subject: [PATCH] cmkae --- assert/image-20241109130700149.png | Bin 0 -> 8065 bytes assert/image-20241109131136773.png | Bin 0 -> 9909 bytes cmake.md | 325 +++++++++++++++++++++++++++++ 3 files changed, 325 insertions(+) create mode 100644 assert/image-20241109130700149.png create mode 100644 assert/image-20241109131136773.png create mode 100644 cmake.md diff --git a/assert/image-20241109130700149.png b/assert/image-20241109130700149.png new file mode 100644 index 0000000000000000000000000000000000000000..6444c8dfc2da2dab4450e57568c32635d89860bf GIT binary patch literal 8065 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 z z1I^g}L>D@f!|wAk>^Z605F;-vRv- z%Q!r*JR9d*eW~Xf{EhknwJx=mODZ~gAww%(Ok-t)3AM)MiY)diWJGV0pZi zBBYpjJ1z41FptUv@zYvTT=4L=Vl}A}&_aRCiqM)lWyh|RLu`wZBL5l9_cg&ER5C_W z)&|A?UC?BV@8y&dn{%S??M5ijRHyqp;ypIw7_Mpsv;j;GhA-KoNfs6)~ai_%R)e{Y13?cCcFe-*wRj5l$mSk-By+|1}Pe>bP-F=J9)fq7qy zo}Y7S7jE#)FeDS;0)SL3NodgeEDrGkQja%V0co%^J6GfAyD5k8qv$N!Bft_wU64{P8zf<3W!^tN7Iof4(B98}zAQXDI}=U=lIbC? zNu3UZ&n4Oo?DpSv^Vaa-;T3Rl)OOFvEihY~pe`to<>bo8Rh#+RmfV zK^Q3ke&=jX6Hg0QbhwC5&;!~_dBD1uE!D)+t9(FLAPQJyS8)Eg@!a0j`741`5u-br zRDhF*M@BtCGH1Pb_so+W!`9L9<*;Ua^Q8qvS{7Jz%lelg5i|sfUzEvI@j+8ix9WrajZ@zc z4-Zd{8iR|JC47=yow&}=!tXx``CmftmgJR&qHJl7Fa1dv(ep=H2zFIT0(#{_NTxZ1 zYq~ksAN8W=SMXC!=<+Yo6|2;8!SnLLn!SAakg [ ...]) +# list 也可以移除 +list(REMOVE_ITEM [ ...]) + +include(path/xx.cmake) # 加载指定路径下的.cmake文件,并执行其中的命令 +add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) +# source_dir:指定了CMakeLists.txt源文件和代码文件的位置,其实就是指定子目录 +# binary_dir:指定了输出文件的路径,一般不需要指定,忽略即可。 +# EXCLUDE_FROM_ALL:在子路径下的目标默认不会被包含到父路径的ALL目标里,并且也会被排除在IDE工程文件之外。用户必须显式构建在子路径下的目标。 +``` + +### cmake中常见的预设变量 + +下面的列表中为大家整理了一些CMake中常用的宏: + +| 宏 | 含义 | +| ------------------------ | ------------------------------------------------------------ | +| CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在的路径 | +| CMAKE_CURRENT_BINARY_DIR | target 编译目录 | +| PROJECT_SOURCE_DIR | 使用cmake命令后紧跟的目录,一般是工程的根目录 | +| EXECUTABLE_OUTPUT_PATH | 重新定义目标二进制可执行文件的存放位置 | +| LIBRARY_OUTPUT_PATH | 重新定义目标链接库文件的存放位置 | +| PROJECT_NAME | 返回通过PROJECT指令定义的项目名称 | +| CMAKE_BINARY_DIR | 项目实际构建路径,假设在build目录进行的构建,那么得到的就是这个目录的路径 | +| | | +| | | + +```cmake +# 当前处理的 CMakeLists.txt 文件所在的路径 +message("CMAKE_CURRENT_LIST_DIR: ${CMAKE_CURRENT_LIST_DIR}") +# 顶层 CMakeLists.txt 文件所在的路径(源代码根目录) +message("CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}") +# 顶层构建目录路径 +message("CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}") +# 当前处理的 CMakeLists.txt 所在的源代码目录路径 +message("CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}") +# 当前处理的 CMakeLists.txt 文件的构建目录路径 +message("CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}") +# 项目名称(由顶层 project() 定义) +message("CMAKE_PROJECT_NAME: ${CMAKE_PROJECT_NAME}") +# CMake 可执行文件路径 +message("CMAKE_COMMAND: ${CMAKE_COMMAND}") +# C 编译器路径 +message("CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}") +# C++ 编译器路径 +message("CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}") +# 安装路径前缀 +message("CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}") +CMAKE_CXX_STANDARD # c++ 使用标准 +CMAKE_C_STANDARD # C语言标准 +``` + +### 日志 + +在CMake中可以用用户显示一条消息,该命令的名字为message: + +```cmake +message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...) +``` + ++ (无) :重要消息 + ++ STATUS :非重要消息 + ++ WARNING:CMake 警告, 会继续执行 + ++ AUTHOR_WARNING:CMake 警告 (dev), 会继续执行 + ++ SEND_ERROR:CMake 错误, 继续执行,但是会跳过生成的步骤 + ++ FATAL_ERROR:CMake 错误, 终止所有处理过程 + + CMake的命令行工具会在stdout上显示STATUS消息,在stderr上显示其他所有消息。CMake的GUI会在它的log区域显示所有消息。 + +CMake警告和错误消息的文本显示使用的是一种简单的标记语言。文本没有缩进,超过长度的行会回卷,段落之间以新行做为分隔符。 + +```cmake +# 输出一般日志信息 +message(STATUS "source path: ${PROJECT_SOURCE_DIR}") +# 输出警告信息 +message(WARNING "source path: ${PROJECT_SOURCE_DIR}") +# 输出错误信息 +message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}") +``` + + + +#### 输出一般日志信息 +message(STATUS "source path: ${PROJECT_SOURCE_DIR}") +#### 输出警告信息 +message(WARNING "source path: ${PROJECT_SOURCE_DIR}") +#### 输出错误信息 +message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}") + +### 构建基本工程 + +```shell +# 文件 +│ CMakeLists.txt +│ main.cpp +│ tools.cpp +│ +└─include + tools.h +``` + +生成可执行文件 + +```cmake +cmake_minimum_required(VERSION 3.14)# 指定使用的 cmake 的最低版本 +# 定义工程名称,并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可 +project(tools) +set(CMAKE_CXX_STANDARD 17) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_LIST_DIR}/bin) # 设置可执行文件的输出路径 + +link_directories("C:/thirdpart/lib") # 搜索库文件目录 每一条命令只能包含一个路径 +# ${CMAKE_CURRENT_LIST_DIR} 变量是最常用的变量之一,表示当前处理的CMakeLists.txt所在的路径,也就是项目的根目录 +include_directories(${CMAKE_CURRENT_LIST_DIR}/include) # 搜索头文件目录 每一条命令只能包含一个路径 + +file(GLOB headers include/*.h*) # 搜索include文件夹下所有h hpp头文件 +file(GLOB src ${CMAKE_CURRENT_LIST_DIR}/*.cpp) # 将当前目录下所有cpp文件后缀的源文件, 赋值给src +# GLOB 参数 搜索给定路径下的所有匹配的文件,并将文件列表存储在变量中,不会递归搜索子目录,参数 GLBO_RECURSE 会递归搜索子目录 +# aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/ src) # 将指定目录下的所有源文件的文件名存入变量名 src 中 与file功能一致 + +add_executable(${PROJECT_NAME} ${src} ${headers}) # 生成可执行文件 ${PROJECT_NAME} 为当前项目的名称 ${src} 为源文件列表 +target_link_libraries(${PROJECT_NAME} PUBLIC datachannel) # 链接库 以公有的方式链接 datachannel 库 + +# add_library(${PROJECT_NAME} SHARED ${src} ${headers}) # 生成动态库 +# add_library(${PROJECT_NAME} STATIC ${src} ${headers}) # 生成静态库 + + +# 构建生成vs工程 +# cd root/ cmake -B build -G "Visual Studio 17 2022" -S . +# cmake --build build --config Debug + + +``` + +生成的vs工程 + +![image-20241109130700149](/assert\image-20241109130700149.png) + +可以看出来,只有将源文件加载到了工程中,看不到头文件 + +需要搜索头文件,并加入生成可执行文件的依赖 + +```cmake +file(GLOB headers include/*.h*) # 搜索include文件夹下所有h hpp头文件 +add_executable(${PROJECT_NAME} ${src} ${headers}) # 生成可执行文件不仅需要源文件还需要头文件 tip:只是针对vs +``` + +再次构建编译后, 可以看到头文件也加载进来了 + +![image-20241109131136773](/assert\image-20241109131136773.png) + +针对构建特定目标,需要加载进来特定头文件等,而非全局 + +```cmake +# target_XXXXX +target_link_directories(目标名字 PUBLIC | PRIVAET | INTERFACE xxxx) # 访问权限,默认为PUBLIC +target_include_directories() +target_link_libraries() + +# 就是跟下面的功能一样,只不过上面是针对特定目标 +link_directories() +include_directories() +link_libraries() + +#eg: +add_library(test1 STATIC test1.cpp) +target_include_directories(test1 PUBLIC include/test1) + +add_library(test2 STATIC test2.cpp) +target_include_directories(test1 PUBLIC include/test2) +# test1 需要用到include/test1中的头文件,而test2依赖他所需要的头文件 +# 当然不管需要不需要 直接全部用include_directories 全部加载进来也是可以的 + +# target_link_libraries 是更推荐的方式,因为它允许更精确的控制和管理链接库的依赖,特别是在大型项目中,它能够避免全局设置可能带来的问题。 +# link_libraries 虽然简单,但在复杂的项目中可能会导致意外的问题,通常适用于简单的项目或临时设置。 +# 建议在 CMake 项目中优先使用 target_link_libraries +``` + ++ PUBLIC:在public后面的库会被Link到前面的target中,并且里面的符号也会被导出,提供给第三方使用。 ++ PRIVATE:在private后面的库仅被link到前面的target中,并且终结掉,第三方不能感知你调了啥库 ++ INTERFACE:在interface后面引入的库不会被链接到前面的target中,只会导出符号。 + +### 流程控制 + +在 CMake 的 CMakeLists.txt 中也可以进行流程控制,也就是说可以像写 shell 脚本那样进行条件判断和循环。 + +#### 条件判断 + +```cmake +# 关于条件判断其语法格式如下: +if() + +elseif() # 可选快, 可以重复 + +else() # 可选快 + +endif() +# 在进行条件判断的时候,如果有多个条件,那么可以写多个elseif,最后一个条件可以使用else,但是开始和结束是必须要成对出现的,分别为:if和endif。 +``` +基本表达式 + +```cmake +# 基本表达式 +if() # NOT AND OR +#]=] +如果是基本表达式,expression 有以下三种情况:常量、变量、字符串。 +如果是1, ON, YES, TRUE, Y, 非零值,非空字符串时,条件判断返回True +如果是 0, OFF, NO, FALSE, N, IGNORE, NOTFOUND,空字符串时,条件判断返回False +#]=] +# 逻辑判断 +if( ) +# 其实这就是一个取反操作,如果条件condition为True将返回False,如果条件condition为False将返回True。 +如果cond1和cond2两个条件中至少有一个为True,返回True,如果两个条件都为False则返回False。 +``` +比较 + +```cmake +if( LESS ) +if( GREATER ) +if( EQUAL ) +if( LESS_EQUAL ) +if( GREATER_EQUAL ) +# LESS:如果左侧数值小于右侧,返回True +# GREATER:如果左侧数值大于右侧,返回True +# EQUAL:如果左侧数值等于右侧,返回True +# LESS_EQUAL:如果左侧数值小于等于右侧,返回True +# GREATER_EQUAL:如果左侧数值大于等于右侧,返回True + + +# 基于字符串的比较 + +if( STRLESS ) +if( STRGREATER ) +if( STREQUAL ) +if( STRLESS_EQUAL ) +if( STRGREATER_EQUAL ) +# STRLESS:如果左侧字符串小于右侧,返回True +# STRGREATER:如果左侧字符串大于右侧,返回True +# STREQUAL:如果左侧字符串等于右侧,返回True +# STRLESS_EQUAL:如果左侧字符串小于等于右侧,返回True +#TRGREATER_EQUAL:如果左侧字符串大于等于右侧,返回True +``` + +#### 循环 + +在 CMake 中循环有两种方式,分别是:foreach和while。 +使用 foreach 进行循环,语法格式如下: + +```cmake +foreach( ) + +endforeach() +``` + +通过foreach我们就可以对items中的数据进行遍历,然后通过loop_var将遍历到的当前的值取出,在取值的时候有以下几种用法: + +```cmake +# 方法1 +foreach( RANGE ) +# RANGE:关键字,表示要遍历范围 +# stop:这是一个正整数,表示范围的结束值,在遍历的时候从 0 开始,最大值为 stop。 +# loop_var:存储每次循环取出的值 +cmake_minimum_required(VERSION 3.2) +project(test) +# 循环 +foreach(item RANGE 10) + message(STATUS "当前遍历的值为: ${item}" ) +endforeach() + +# 方法二 +foreach( RANGE []) +#[=[ +这是上面方法1的加强版,我们在遍历一个整数区间的时候,除了可以指定起始范围,还可以指定步长。 +RANGE:关键字,表示要遍历范围 +start:这是一个正整数,表示范围的起始值,也就是说最小值为 start +stop:这是一个正整数,表示范围的结束值,也就是说最大值为 stop +step:控制每次遍历的时候以怎样的步长增长,默认为1,可以不设置 +loop_var:存储每次循环取出的值 +#]=] +cmake_minimum_required(VERSION 3.2) +project(test) + +foreach(item RANGE 10 30 2) + message(STATUS "当前遍历的值为: ${item}" ) +endforeach() + +``` + + + +## 工程实践 + +### 导出安装