CMake语法复习

前言

此文总结了库的制作和一些CMake常用的一些语法。

一:创建静态库和动态库

静态库的生成和使用

 动态库的生成和使用

二:使用CMake来生成Makefile,生成可执行文件

顶层目录下的CMakeLists.txt

project(HELLO)
add_subdirectory(libhello)
add_subdirectory(src)

libhello目录下的CMakeLists.txt

set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_library(libhello hello.c)
set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")

src目录下的CMakeLists.txt

include_directories(${PROJECT_SOURCE_DIR}/libhello)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(helloApp main.c)
target_link_libraries(helloApp libhello)

最后进入到build目录下进行cmake ../,make之后,helloApp会在build/bin目录下,libhello.a会在/build/lib目录下

三:list相关操作

工程文件目录

对list进行一些操作

cmake_minimum_required(VERSION 3.22)
project(HELLO)
add_subdirectory(src)
add_subdirectory(libhello)set(helloList "hello world")
message(${helloList})aux_source_directory(src list1)
message("list1 = ${list1}")aux_source_directory(libhello list2)
message("list2 = ${list2}")list(LENGTH helloList helloListLength)
message("helloListLength = ${helloListLength}")list(APPEND list1 ${list2})
message("after append list1 = ${list1}")list(GET list1 0 VAR1)
message("var1 in list1 after append = ${VAR1}")

打印结果

 四:头文件和库

private、interface、public三个参数的区别

⚫ 当使用 PRIVATE 关键字修饰时,意味着 包含目录列表仅用于当前目标;
⚫ 当使用 INTERFACE 关键字修饰时,意味着 包含目录列表不用于当前目标、只能用于依赖该目标的其它目标,也就是说 cmake 会将 包含目录列表传递给当前目标的依赖目标;
⚫ 当使用 PUBLIC 关键字修饰时,这就是以上两个的集合, 包含目录列表既用于当前目标、也会传递给当前目标的依赖目标。

target_link_libraries(hello_world INTERFACE hello):表示目标 hello_world 不需要链接 hello 库,但是对于 hello_world 目标的依赖目标(依赖于 hello_world 的目标)它们需要链接 hello 库。

五:部分变量

在src目录下的CMakeLists.txt中添加PROJECT_SOURCE_DIR、PROJECT_BINARY_DIR、CMAKE_CURRENT_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR。在build目录下进行cmake ../编译。

打印结果

可执行程序和库文件的输出路径EXECUTABLE_OUTPUT_PATH、LIBRARY_OUTPUT_PATH

六:循环语句(foreach)

foreach语句

cmake_minimum_required(VERSION 3.22)
project(HELLO)
add_subdirectory(src)
add_subdirectory(libhello)set(myList happy qixi festival lm)
foreach(temp ${myList})message("${temp}")
endforeach()foreach(temp "${myList}")message("${temp}")
endforeach()

 打印结果

七:数学运算math

cmake_minimum_required(VERSION 3.22)
project(HELLO)
add_subdirectory(src)
add_subdirectory(libhello)math(EXPR RET1 "100 + 200")
math(EXPR RET2 "100 * 200")
math(EXPR RET3 "1 & 0")
message("${RET1}, ${RET2}, ${RET3}")

打印结果

八:函数(function)

通过 function()定义的函数它的使用范围是全局的,并不局限于当前源码、可以在其子源码或者父源码中被使用

function(myprintf arg1 arg2)message("${arg1} ${arg2}")
endfunction()myprintf(hello world)

打印结果

函数内的局部变量

ARGVXX 是一个数字,譬如 ARGV0、ARGV1,ARGV0 为第一个参数、ARGV1 位第二个参数
ARGV 实际调用时传入的参数会存放在 ARGV 变量中(如果是多个参数,那它就是一个参数列表)
ARGN 假如定义函数时参数为 2 个,实际调用时传入了 4 个,则 ARGN 存放了剩下的 2 个参数(如果是多个参数,那它也是一个参数列表)
ARGC调用函数时,实际传入的参数个数
cmake_minimum_required(VERSION 3.22)
project(HELLO)
add_subdirectory(src)
add_subdirectory(libhello)function(myprintf arg1 arg2)message("ARGC = ${ARGC}")message("ARGV = ${ARGV}")message("ARGN = ${ARGN}")message("ARGV0 = ${ARGV0}")set(i 0)foreach(var ${ARGV})message("var${i} = ${var}")math(EXPR i "${i} + 1")endforeach()endfunction()myprintf(hello world impressive)

打印结果

九:文件操作(file)

WRITE文件不存在就新建一个文件,如果文件存在就覆盖写
APPEND在文件末追加
READ读取文件,可以以二进制的形式读(HEX)
GENERATE通过文件(INPUT)或内容(CONTENT)来生成新文件
STRINGS以字符串形式读取
RENAME重命名
REMOVE删除文件
cmake_minimum_required(VERSION 3.22)
project(HELLO)
add_subdirectory(src)
add_subdirectory(libhello)file(WRITE test.txt "impressiv and attractive\n")
file(APPEND test.txt "ONU and OLT")file(GENERATE OUTPUT out1.txt INPUT "${PROJECT_SOURCE_DIR}/test.txt")
file(GENERATE OUTPUT out2.txt CONTENT "hello world")file(READ "${PROJECT_SOURCE_DIR}/test.txt" read_buf)
message("!!!read from test.txt: !!!\n" ${read_buf})
file(READ "${PROJECT_SOURCE_DIR}/test.txt" outvar1 OFFSET 0 LIMIT 6)
message("outvar1 OFFSET 0 LIMIT 6 is \n" ${outvar1})
file(READ "${PROJECT_SOURCE_DIR}/test.txt" outvar2 OFFSET 0 LIMIT 6 HEX)
message("outvar2 OFFSET 0 LIMIT 6 HEX is \n" ${outvar2})file(STRINGS "${PROJECT_SOURCE_DIR}/test.txt" outvar3 LENGTH_MAXIMUM 6)
message("outvar3 LENGTH_MAXIMUM 6 is \n" "${outvar3}")
file(STRINGS "${PROJECT_SOURCE_DIR}/test.txt" outvar4 LENGTH_MINIMUM 4)
message("outvar4 LENGTH_MINIMUM 2 is \n" "${outvar4}")
file(STRINGS "${PROJECT_SOURCE_DIR}/test.txt" outvar5 LIMIT_COUNT 1)
message("outvar5 LIMIT_COUNT 1 is \n" "${outvar5}")file(WRITE "${PROJECT_SOURCE_DIR}/temp.txt" "")
file(RENAME "${PROJECT_SOURCE_DIR}/temp.txt" "${PROJECT_SOURCE_DIR}/change.txt")
file(REMOVE "${PROJECT_SOURCE_DIR}/change.txt")

message打印内容

十:设置交叉编译链

总结

以上就是本文的全部内容了,希望可以帮到你。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何给ELK日志加上索引

问题记录 1、遇到长流程的时候,日志记录是非常重要的。如何排查日志,可以在MDC中去put对应的值,这样就等于对你关心的关键字段加上了索引,在elk中可以通过该索引就能 容易排查到问题 logback的设置 可以参照: 【总体…

Gin路由组

Gin路由组 文章目录 Gin路由组接收任意请求的路由接收没有被定义的路由路由组完整代码 接收任意请求的路由 区别于以往的GET()函数只能处理一种请求,Any()函数可以处理各种函数 语法: func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc){} 案例: …

Python项目实战:基于napari的3D可视化(点云+slice)

文章目录 一、napari 简介二、napari 安装与更新三、napari【巨巨巨大的一个BUG】四、napari 使用指南4.1、菜单栏(File View Plugins Window Help)4.2、Window:layer list(参数详解)4.3、Window:layer…

【环境搭建】windows系统搭建python开发环境--安装anaconda

今天买了一台新电脑,用此新电脑做一个搭建python开发环境的教程,安装anaconda教程。 新电脑是Windows操作系统,因此此教程适用于新手在windows操作系统下安装anaconda。 Anaconda 是一个开源的 Python 发行版本,包含了 Conda、Python 等超过 180 个科学包及其依赖项。Ana…

Android集成MQTT教程:实现高效通信和实时消息传输

MQTT是一种基于发布/订阅模式的消息传输协议,它使用TCP/IP协议进行通信。MQTT的设计原则是轻量级、简单和可靠,适用于各种网络环境和设备。MQTT采用了订阅(Subscribe)和发布(Publish)的模式,客户…

面试题-React(二):React中的虚拟DOM是什么?

一、什么是虚拟DOM? 虚拟DOM是React的核心概念之一,它是一个轻量级的JavaScript对象树,用于表示真实DOM的状态。在React中,当数据发生变化时,首先会在虚拟DOM上执行DOM更新,而不是直接操作真实DOM。然后&a…

FPGA:uart原理+tx发送模块+rx接收模块

文章目录 一、串口通信二、UART通信三、tx发送模块四、rx模块接收 一、串口通信 处理器与外部设备通信的两种方式: 串行通信: 指数据的各个位使用多条数据线同时进行传输。 并行通信: 将数据分成一位一位的形式在一条数据线上逐个传输。 串…

Pycharm找不到Conda可执行文件路径(Pycharm无法导入Anaconda已有环境)

在使用Pycharm时发现无法导入Anaconda创建好的环境,会出现找不到Conda可执行文件路径的问题。 解决 在输入框内输入D:\anaconda3\Scripts\conda.exe,点击加载环境。 注意前面目录是自己Anaconda的安装位置,之后就可以找到Anaconda的现有环…

Dubbo之DubboBootstrap源码解析

功能描述 DubboBootstrap是Dubbo的启动类,包含服务启动、初始化、预处理配置、销毁清理等核心功能 功能分析 核心DubboBootstrap类分析 主要成员变量分析 private static volatile DubboBootstrap instance; //缓存者启动类的实例对象,以static形式…

Mr. Cappuccino的第63杯咖啡——Spring之AnnotationConfigApplicationContext源码分析

Spring之AnnotationConfigApplicationContext源码分析 源码分析 源码分析 以上一篇文章《Spring之Bean的生命周期》的代码进行源码分析 AnnotationConfigApplicationContext applicationContext new AnnotationConfigApplicationContext(SpringConfig02.class); LifeCycleBe…

第17集丨Vue中的render函数

目录 一、脚手架中不能使用template配置二、基本使用三、关于不同版本的Vue 一、脚手架中不能使用template配置 // 引入vue import Vue from vue import App from ./Appnew Vue({el:#app,template:<h1>hhh</h1>,comments:{App},})上面案例中&#xff0c;配置了temp…

电子商务的安全防范

(1)安全协议问题&#xff1a;我国大多数尚处在 SSL&#xff08;安全套接层协议&#xff09;的应用上&#xff0c;SET 协议的应用还只是刚刚试验成功&#xff0c;在信息的安全保密体制上还不成熟&#xff0c;对安全协议 还没有全球性的标准和规范&#xff0c;相对制约了国际性…

Mac 使用 rar 命令行工具解压和压缩文件

在 Mac 中常遇到的压缩文件有 zip 和 rar 格式的&#xff0c;如果是 zip 格式的 Mac 系统默认双击一下文件就能直接解压了&#xff0c;但 rar 文件就不行。 需要额外下载 rar 工具了实现。 第一步&#xff1a;下载 rar 工具 工具网址&#xff1a;https://www.rarlab.com/dow…

大语言模型之四-LlaMA-2从模型到应用

最近开源大语言模型LlaMA-2火出圈&#xff0c;从huggingface的Open LLM Leaderboard开源大语言模型排行榜可以看到LlaMA-2还是非常有潜力的开源商用大语言模型之一&#xff0c;相比InstructGPT&#xff0c;LlaMA-2在数据质量、培训技术、能力评估、安全评估和责任发布方面进行了…

微服务—远程调用(RestTemplate)

在微服务的所有框架中&#xff0c;SpringCloud脱颖而出&#xff0c;它是目前国内使用的最广泛的微服务框架 &#xff08;官网地址&#xff09;&#xff0c;它集成了各种微服务功能组件&#xff0c;并基于SpringBoot实现了这些组件的自动装配&#xff0c;从而提供了良好的开箱…

3D- vista:预训练的3D视觉和文本对齐Transformer

论文&#xff1a;https://arxiv.org/abs/2308.04352 代码: GitHub - 3d-vista/3D-VisTA: Official implementation of ICCV 2023 paper "3D-VisTA: Pre-trained Transformer for 3D Vision and Text Alignment" 摘要 三维视觉语言基础(3D- vl)是一个新兴领域&…

在 React+Typescript 项目环境中创建并使用组件

上文 ReactTypescript清理项目环境 我们将自己创建的项目环境 好好清理了一下 下面 我们来看组件的创建 组件化在这种数据响应式开发中肯定是非常重要的。 我们现在src下创建一个文件夹 叫 components 就用他专门来处理组件业务 然后 我们在下面创建一个 hello.tsx 注意 是t…

Azure共享映像库构建VM镜像

什么是Azure共享映像库 Azure共享映像库是一项在Microsoft Azure中以共享方式存储和管理映像的服务。映像是预配置的虚拟机操作系统和应用程序的快照&#xff0c;可以用来创建多个虚拟机实例。通过将映像存储在共享映像库中&#xff0c;用户可以轻松地共享映像给其他Azure订阅…

go文件基本操作

一、文件读操作 文件内容如下&#xff1a; 水陆草木之花&#xff0c;可爱者甚蕃。 晋陶渊明独爱菊。自李唐来&#xff0c;世人甚爱牡丹。 予独爱莲之出淤泥而不染&#xff0c;濯清涟而不妖&#xff0c;中通外直&#xff0c;不蔓不枝&#xff0c;香远益清&#xff0c;亭亭净植…

探索无限创造力的星辰大道,画出想象的浩瀚宇宙!-turtle

介绍 视频教程地址在此&#xff1a;https://www.bilibili.com/video/BV1Pm4y1H7Tb/ 大家好&#xff0c;欢迎来到本视频&#xff01;今天&#xff0c;我们将一同探索Python编程世界中的一个有趣而创意的库——Turtle库。无需专业绘画技能&#xff0c;你就可以轻松地用代码绘制…