CMake语法复习

这篇具有很好参考价值的文章主要介绍了CMake语法复习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

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

一:创建静态库和动态库

静态库的生成和使用

CMake语法复习,脚本用法,linux,运维,服务器,CMake

 动态库的生成和使用

CMake语法复习,脚本用法,linux,运维,服务器,CMake

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

顶层目录下的CMakeLists.txt

CMake语法复习,脚本用法,linux,运维,服务器,CMake

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

libhello目录下的CMakeLists.txt

CMake语法复习,脚本用法,linux,运维,服务器,CMake

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

src目录下的CMakeLists.txt

CMake语法复习,脚本用法,linux,运维,服务器,CMake

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目录下

CMake语法复习,脚本用法,linux,运维,服务器,CMake

三:list相关操作

工程文件目录

CMake语法复习,脚本用法,linux,运维,服务器,CMake

对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}")

打印结果

CMake语法复习,脚本用法,linux,运维,服务器,CMake

 四:头文件和库

CMake语法复习,脚本用法,linux,运维,服务器,CMake

CMake语法复习,脚本用法,linux,运维,服务器,CMake

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

CMake语法复习,脚本用法,linux,运维,服务器,CMake

⚫ 当使用 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 ../编译。

CMake语法复习,脚本用法,linux,运维,服务器,CMake

打印结果

CMake语法复习,脚本用法,linux,运维,服务器,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()

CMake语法复习,脚本用法,linux,运维,服务器,CMake

 打印结果

CMake语法复习,脚本用法,linux,运维,服务器,CMake

七:数学运算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}")

CMake语法复习,脚本用法,linux,运维,服务器,CMake

打印结果

CMake语法复习,脚本用法,linux,运维,服务器,CMake

八:函数(function)

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

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

myprintf(hello world)

打印结果

CMake语法复习,脚本用法,linux,运维,服务器,CMake

函数内的局部变量

ARGVX X 是一个数字,譬如 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)

打印结果

CMake语法复习,脚本用法,linux,运维,服务器,CMake

九:文件操作(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打印内容

CMake语法复习,脚本用法,linux,运维,服务器,CMake

十:设置交叉编译链

CMake语法复习,脚本用法,linux,运维,服务器,CMake

总结

以上就是本文的全部内容了,希望可以帮到你。文章来源地址https://www.toymoban.com/news/detail-668562.html

到了这里,关于CMake语法复习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 运维 | 查看 Linux 服务器 IP 地址

    大多数在操作 Linux 系统时,我们经常需要知道服务器的 IP 比便于后续的一系列操作,这时候有快速查看主机 IP 的命令行操作,能够有效的帮助我们 本章节主要记录一些常用查看服务器 IP 的命令,希望对大家有所帮助。 查看 Linux 服务器的 IP 地址的命令大体上有以下几种。

    2024年04月27日
    浏览(78)
  • 【运维】Linux 跨服务器复制文件文件夹

    如果是云服务 建议用内网ip scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来

    2024年02月08日
    浏览(66)
  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    本文思维导图概述的主要内容: 1.1 什么是 crontab Crontab 是一个在 Unix 和 Linux 操作系统上 用于定时执行任务 的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab 是 cron table 的缩写, cron 指的是 Unix 系统中的一个后台进程,它

    2024年02月08日
    浏览(86)
  • 服务器巡检脚本(linux)

    2024年02月20日
    浏览(44)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(76)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(92)
  • Linux服务器定时执行脚本清理日志

    程序的日志不正确或者启动脚本命令不正确,随着程序的持续运行,日志文件越来越大,持续占用设备硬盘,如果定期手动清理日志又比较占用大脑CPU和内存,如果忘了就是事故,所以写一个定时执行的脚本去清理日志很有必要。 清理日志有两种方式,一种是清空文件,主要

    2024年02月05日
    浏览(47)
  • Linux:服务器间同步文件的脚本(实用)

    比如有三台服务器, hadoop102、hadoop103、hadoop104 ,且都有 atguigu 账号 循环复制文件到所有节点的相同目录下,且脚本可以在任何路径下使用 1、查看环境变量 2、进入 /home/atguigu/bin 目录 在该目录下创建脚本,则该脚本可以在任何路径下使用,因为,这个路径添加在环境变量中

    2024年04月28日
    浏览(41)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(89)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包