CMake语法复习

news2024/9/24 3:26:06

前言

此文总结了库的制作和一些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.coloradmin.cn/o/900708.html

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

相关文章

设计模式之备忘录模式(Memento)的C++实现

1、备忘录模式的提出 在软件功能开发过程中,某些对象的状态在转换过程中,由于业务场景需要,要求对象能够回溯到对象之前某个点的状态。如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节。备忘录模式是在不…

ps打开出现dll文件丢失怎么回事?该如何修复

今天在看到一个ps的相关问题,可能很多同学也遇到过,安装好ps软件之后,打开会提示无法启动此程序。然后会有各种文件的丢失一般都是xxx.dll文件的格式,并提示尝试重新安装该程序,以解决此问题。不但是PS,还有…

226、仿真-基于51单片机楼道教室走道智能灯光光照人体感应检测控制Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…

java:数据库连接池

概念 举个例子来说吧,假设我们开了一家餐馆,客人来了,我们就请一个服务员,使用完后再把他开除了,下个客人再来了,我们再请一个,使用完再开除。 这是不是我们现在使用 JDBC 连接数据库的场景&a…

电脑提示缺少vcomp140.dll怎样修复-vcomp140.dll丢失怎么办?

在使用电脑软件或者玩游戏时候,我们有时候会遇到提示系统丢失DLL状况,相信很多用电脑的都遇到过,我曾多次遇到提示丢失DLL,每次都要折腾了几小时,终于!在我多次折腾后,,有幸得到这个…

ForkJoinPool 你真的明白和用对了吗

ForkJoinPool 是一个功能强大的 Java 类,用于处理计算密集型任务,使用 ForkJoinPool 分解计算密集型任务,并并行执行它们,能够产生更好的性能。它的工作原理是将任务分解成更小的子任务,使用分而治之的策略进行操作&am…

mysql数据传输到mssql

一、找开Navicat Premium 12 此时目标数据库会创建一个同名的表

ElasticSearch DSL语句(bool查询、算分控制、地理查询、排序、分页、高亮等)

文章目录 DSL 查询种类DSL query 基本语法1、全文检索2、精确查询3、地理查询4、function score (算分控制)5、bool 查询 搜索结果处理1、排序2、分页3、高亮 RestClient操作 DSL 查询种类 查询所有:查询所有数据,一般在测试时使…

【C++11新特性】lambda表达式

文章目录 1. lambda表达式概念2. lambda表达式语法3. lambda表达式应用 1. lambda表达式概念 lambda表达式是一个匿名函数,恰当使用lambda表达式可以让代码变得简洁,并且可以提高代码的可读性。 见见lambda表达式的使用 现在要对若干商品分别按照价格和…

Java并发----创建线程的三种方式及查看进程线程

一、直接使用 Thread // 创建线程对象 Thread t new Thread() {public void run() {// 要执行的任务} }; // 启动线程 t.start(); 例如: // 构造方法的参数是给线程指定名字,推荐 Thread t1 new Thread("t1") {Override// run 方法内实现…

LED驱动型IC芯片的原理介绍

一、LED驱动器是什么 LED驱动器(LED Driver),是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LED PN结的导通特性决定,它能适应的电源电压和电流变动范围十分狭窄,稍许偏离就可能无法点亮LED或者发光效…

AraNet:面向阿拉伯社交媒体的新深度学习工具包

阿拉伯语是互联网上第四大最常用的语言,它在社交媒体上的日益增加为大规模研究阿拉伯语在线社区提供了充足的资源。然而,目前很少有工具可以从这些数据中获得有价值的见解,用于决策、指导政策、协助应对等。这种情况即将改变吗? …

Java日志框架-JUL

JUL全称Java util logging 入门案例 先来看着入门案例,直接创建logger对象,然后传入日志级别和打印的信息,就能在控制台输出信息。 可以看出只输出了部分的信息,其实默认的日志控制器是有一个默认的日志级别的,默认就…

串口通讯

USART是全双工同步通讯 在同步通信中,数据信号所传输的内容绝大多数属于有效数据,而异步通信中包含了各种帧的标识符,所以同步通讯的效率更高。但是同步通信对时钟要求苛刻,允许的误差小。而异步通信则允许双方的误差较大 比特率…

【MySQL系列】--初识数据库

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

币圈最后的黑暗时刻?也是牛市来临前的准备阶段!

最近加密市场的波动并不乐观,整体走势呈下行趋势,比特币价格跌至2.5万美元,以太坊更是跌破1500美元,其他山寨币也纷纷下挫,市场情绪相对悲观。 更令人担忧的是,当前加密市场缺乏新的叙事,也没有…

JVM学习笔记(一)

1. JVM快速入门 从面试开始: 请谈谈你对JVM 的理解?java8 的虚拟机有什么更新? 什么是OOM ?什么是StackOverflowError?有哪些方法分析? JVM 的常用参数调优你知道哪些? 内存快照抓取和MAT分…

UAF释放后重引用原理

原地址:https://blog.csdn.net/qq_31481187/article/details/73612451 原作者代码是基于linux系统的演示代码,因为windows和Linux 内存管理机制上略有不同,该程序在Windows需要稍微做些改动。 Windows上执行free释放malloc函数分配的内存后…

javascript期末作业【三维房屋设计】 【源码+文档下载】

1、引入three.js库 官网下载three.js 库 放置目录并引用 引入js文件: 设置场景(scene) (1)创建场景对象 (2)设置透明相机 1,透明相机的优点 透明相机机制更符合于人的视角,在场景预览和游戏场景多有使用…