做网站设计的公司/seo网站推广公司
CMakeLists.txt结构
总结该文件的主要结构
cmake_minimum_required(VERSION <version>)
- 指定CMake的最低版本,一般都是根据项目需要设定
cmake_minimum_required(VERSION 3.10)
project(<name>)
- 定义项目的名称,放在CMake的开头
project(MyProject)
add_executable(<target> <source_files>)
- 定义一个可执行的文件目标,并指定其源文件(可以是.cpp .c .h等文件)
- target:目标的名称,也就是最终生成的可执行文件的名称,这个名称将在构建目录中生成对应的可执行文件
- <source_files>:一组源文件,这些文件将被编译成目标可执行文件
- 也可以使用通配符,自动找到其源文件
- 下面事例就表明找到当前目录下的所有.cpp文件作为源文件包含进来
file(GLOB SOURCES "*.cpp")
add_executable(MyExecutable ${SOURCES})
target_link_libraries(<target> <libraries>)
- 将库链接到指定的目标文件上,从而确保编译生成的可执行文件或者库可以与外部库进行链接
- <target>:该目标名称可以是可执行文件,也可以是动静态库
- <libraries>):外部库、静态和动态库、CMake内部目标
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 定义 MyLibrary 库
add_library(MyLibrary STATIC MyLibrary.cpp)# 定义可执行文件
add_executable(MyExecutable main.cpp)# 将 MyLibrary 链接到 MyExecutable
target_link_libraries(MyExecutable MyLibrary)
CMake 常见命令
aux_source_directory
aux_source_directory(<dir> <variable>)
- 扫描dir目录下所有的源文件,并将这些文件存储在variable变量中
- <dir>:需要扫描的目录路径,这里可以是相对路径和绝对路径
- <variable>:使用一个CMake变量,扫描所有源文件的路径就爱那个被存储在该变量中
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 使用 aux_source_directory 扫描 src 目录下的所有源文件
aux_source_directory(src SRC_FILES)# 输出查看扫描到的源文件
message(STATUS "Source files: ${SRC_FILES}")# 创建可执行文件并将扫描到的源文件传递给它
add_executable(MyExecutable ${SRC_FILES})
- message(STATUS "Source files: ${SRC_FILES}"):配置阶段输出扫描到的源文件路径,从而验证文件是否被正常的添加
- add_executable(MyExecutable ${SRC_FILES}):给所有源文件创建一个名为MyExecutable的可执行文件
include_directories
include_directories(<dir>)
- 作用:指定头文件的搜索路径,使得其在编译的时候,编译器可以找到这些目录的头文件
- ${CMAKE_SOURCE_DIR}:CMake内置变量,指向项目的根目录
- ${CMAKE_SOURCE_DIR}/include:编译器根据此命令就可以找到include/MyLibrary.h头文件
/project├── CMakeLists.txt├── include└── MyLibrary.h├── src└── main.cpp
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 将 include 目录添加到头文件搜索路径中
include_directories(${CMAKE_SOURCE_DIR}/include)# 创建可执行文件
add_executable(MyExecutable src/main.cpp)
set
set(<variable> <value>)
- 作用:用于定义和设置变量的值,通过该命令可以存储类似于源文件路径、编译选项、配置选项等信息
- <variable>:需要设置的变量名称,可以是任何有效的变量名
- <value>:给变量赋的值,这个值可以是字符串、文件路径、列表数字等
set(SRC_FILES main.cpp foo.cpp bar.cpp)
set(CMAKE_CXX_STANDARD 11)
- set(SRC_FILES main.cpp foo.cpp bar.cpp):将SRC_FILES变量设置为后面内容的列表,这样后续的命令就可以通过引用SRC_FILES
- 下面的事例:将SRC_FILES中的所有文件都作为源文件给add_executable,生成可执行文件
- set(CMAKE_CXX_STANDARD 11):表示用C++11标准去编译代码
set 一些常见用法总结
# 设置源文件列表
# 这里将所有源文件列出,并将其存储在 SOURCES 变量中
set(SOURCES main.cpp foo.cpp bar.cpp)# 创建一个可执行文件 MyExecutable,并将 SOURCES 变量中的文件作为源文件
add_executable(MyExecutable ${SOURCES})# 设置编译选项
# 这里设置了 C++ 编译器的选项,添加了警告标志 -Wall 和 -Wextra
set(CMAKE_CXX_FLAGS "-Wall -Wextra")# 设置库的路径
# 这里设置了 MY_LIBRARY_PATH 变量,指向一个包含库文件的路径
set(MY_LIBRARY_PATH /usr/local/lib)# 设置选项(布尔变量)
# 例如,设置 MY_OPTION 为 ON,通常用于配置项目的某些开关选项
set(MY_OPTION ON)# 高级用法:设置列表变量
# 使用 set 命令将多个源文件加入 SOURCE_FILES 变量中
set(SOURCE_FILESmain.cppfoo.cppbar.cpp
)# 创建一个可执行文件 MyExecutable,并将 SOURCE_FILES 中的源文件加入其中
add_executable(MyExecutable ${SOURCE_FILES})# 高级用法:添加目录到 CMake 搜索路径
# 例如,添加头文件路径到 CMake 的 include 路径
set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "/path/to/my/include")# 高级用法:修改已有变量
# 假设 SRC_FILES 之前已经定义,这里将其更新为新的文件列表
set(SRC_FILES main.cpp newfile.cpp) # SRC_FILES 将被更新为新的文件列表# 高级用法:导出变量到 CMake 缓存
# 这会将变量 MY_VAR 添加到 CMake 缓存中,使得它可以在配置过程中修改并保持
set(MY_VAR "Some Value" CACHE STRING "Description of the variable")# 最终,使用这些设置来创建可执行文件或进行其他操作
add_executable(MyExecutable ${SRC_FILES})
add_custom_command
- 作用:用于构建过程中执行自定义命令,可以是生成脚本、运行脚本或者其他操作
- OUTPUT <output_files>:指定此命令生成的文件或文件列表。CMake 会跟踪这些文件,并在需要时重新运行命令(例如当文件依赖项发生变化时)
- COMMAND <command> [<args>...]:定要执行的命令及其参数。你可以运行任何外部程序或脚本
- DEPENDS <dependencies>:指定此命令的依赖项文件。如果这些文件发生变化,CMake 会重新运行命令
- WORKING_DIRECTORY <directory>:指定命令执行时候的工作目录
- COMMENT <comment>:一个描述性文本,用于在构建过程中打印,帮助用户了解正在执行的命令
add_custom_command(OUTPUT <output_files>COMMAND <command> [<args>...]DEPENDS <dependencies>WORKING_DIRECTORY <directory>COMMENT <comment>VERBATIM)
install
install(TARGETS <target> DESTINATION <directory>)
install(FILES <file1> <file2> ... DESTINATION <directory>)
install(DIRECTORY <dir> DESTINATION <directory>)
- TARGETS <target>:指定要安装的目标,可以同时指定多个目标
- DESTINATION <directory>:指定文件的安装位置,可以是相对路径也可以是绝对路径
- FILES <file1> <file2> ...:指定要安装的单个或者多个文件
- DIRECTORY <dir>:用于安装目录中的所有文件和子目录
- PERMISSIONS <permissions>:可选,用于设定安装文件的权限
# 假设我们有一个可执行文件 MyExecutable 和一个头文件 myheader.h# 设置目标
add_executable(MyExecutable main.cpp foo.cpp)# 安装可执行文件到 bin 目录
install(TARGETS MyExecutable DESTINATION bin)# 安装头文件到 include 目录
install(FILES myheader.h DESTINATION include)# 安装库文件到 lib 目录(假设有一个库文件)
install(TARGETS MyLibrary DESTINATION lib)# 安装整个资源文件夹
install(DIRECTORY assets/ DESTINATION assets)# 打印安装成功的消息
message("Installation complete!")
处理库和依赖项
target_link_libraries()
- 作用:将一个或者多个库文件链接到目标文件
- <target>:要链接依赖库的目标,这里可以是可执行文件也可以是库文件
- <library>:要链接的库文件,动静态库
target_link_libraries(<target> <library1> <library2> ...)
指定库的路径然后进行链接
# 指定库文件的路径
link_directories(/path/to/libs)# 链接静态库
target_link_libraries(MyExecutable /path/to/libs/libgflags.a /path/to/libs/libprotobuf.a)
查找库的位置然后进行链接
- find_package(gflags REQUIRED):在系统中查找gflags库,并设置对应的变量,下同
# 查找并配置 gflags 和 protobuf 库
find_package(gflags REQUIRED)
find_package(Protobuf REQUIRED)# 定义目标并链接库
add_executable(MyExecutable main.cpp)
target_link_libraries(MyExecutable gflags::gflags protobuf::libprotobuf)
链接系统库
# 链接 pthread 库
target_link_libraries(MyExecutable pthread)
安装在非标准路径下的库,告知库如何链接的方法
针对于该问题也可以采用暴力的方法,直接复制系统库到系统路径下
- link_directories():为链接器设置文件搜索路径
- CMAKE_PREFIX_PATH:指定CMake查找包和库的路径
# 设置 CMake 查找库的路径
set(CMAKE_PREFIX_PATH "/path/to/libs")# 设置库目录
link_directories("/path/to/libs")# 链接库
target_link_libraries(MyExecutable mylib)
Protobuf 与 CMake集成
两者集合的主要目标就是构建过程中自动生成 .pb.cc 和 .pb.h文件,然后将器放进入到目标文件中
- set(PROTO_FILE ...):指定.proto文件的路径
- set(GENERATED_PROTO_SRC ...)和set(GENERATED_PROTO_HEADER ...):制定生成C++源文件和头文件的位置
- file(MAKE_DIRECTORY ...):确保目录文件存在,这样就可以避免生成失败
- add_custom_command()
- OUTPUT:指定生成的文件
- COMMAND:运行protoc编译器来生成目标文件
- DEPENDS:指定输入文件,当.proto文件修改的时候,CMake会自动生成
- VERBATIM:确定命令按原样传递,从而避免参数解析问题
- add_executable():将生成管道.pb.cc文件添加到可执行文件的源目录的文件列表中
- target_link_libraries():链接库
# 设置 Protobuf 文件的路径
set(PROTO_FILE ${CMAKE_SOURCE_DIR}/myproto.proto)# 生成 Protobuf 文件的路径
set(GENERATED_PROTO_SRC ${CMAKE_BINARY_DIR}/generated/myproto.pb.cc)
set(GENERATED_PROTO_HEADER ${CMAKE_BINARY_DIR}/generated/myproto.pb.h)# 创建生成 Protobuf 文件的目录
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/generated)# 使用 protoc 编译生成 .pb.cc 和 .pb.h 文件
add_custom_command(OUTPUT ${GENERATED_PROTO_SRC} ${GENERATED_PROTO_HEADER}COMMAND protoc --cpp_out=${CMAKE_BINARY_DIR}/generated ${PROTO_FILE}DEPENDS ${PROTO_FILE} # 依赖 .proto 文件COMMENT "Running protoc to generate .pb.cc and .pb.h files"VERBATIM
)# 将生成的 .pb.cc 文件加入到目标文件
add_executable(MyExecutable main.cpp ${GENERATED_PROTO_SRC})# 如果还需要链接到其他库(如 protobuf 库)
target_link_libraries(MyExecutable protobuf)# 包含生成文件的头文件路径
include_directories(${CMAKE_BINARY_DIR}/generated)
相关文章:

Cmake 常用操作总结
CMakeLists.txt结构 总结该文件的主要结构 cmake_minimum_required(VERSION <version>) 指定CMake的最低版本,一般都是根据项目需要设定 cmake_minimum_required(VERSION 3.10) project(<name>) 定义项目的名称,放在CMake的开头 project(…...

Kylin Server V10 下 RocketMQ 主备自动切换模式部署
一、NameServer简介 NameServer 是一个注册中心,提供服务注册和服务发现的功能。NameServer 可以集群部署,集群中每个节点都是对等的关系,节点之间互不通信。 服务注册 Broker 启动的时候会向所有的 NameServer 节点进行注册,注意这里是向集群中所有的 NameServer 节点注册…...

DevOps工程技术价值流:GitLab源码管理与提交流水线实践
在当今快速迭代的软件开发环境中,DevOps(开发运维一体化)已经成为提升软件交付效率和质量的关键。而GitLab,作为一个全面的开源DevOps平台,不仅提供了强大的版本控制功能,还集成了持续集成/持续交付(CI/CD)…...

Vue 3 中实现页面特定功能控制
在开发 Vue 应用时,我们经常会遇到需要在特定页面启用或禁用某些功能的情况。本文将以 A父.vue 页面为例,探讨如何在点击汇总菜单时仅在该页面生效,而在其他页面不生效的问题。 1. 利用 Vue 3 的 provide 和 inject 实现状态传递 Vue 3 提供…...

VLC 播放的音视频数据处理流水线搭建
VLC 用 input_thread_t 对象直接或间接管理音视频播放有关的各种资源,包括 Access,Demux,Decode,Output,Filter 等,这个类型定义 (位于 vlc-3.0.16/include/vlc_input.h) 如下: struct input_thread_t {VLC_COMMON_MEMBERS };input_thread_t 是个抽象类型,VLC 中这个类…...

何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)
在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...

学习笔记043——HashMap源码学习1
文章目录 1、HashMap2、Hashtable3、TreeMap4、HashMap 底层结构4.1、什么是红黑树? 1、HashMap HashMap key 是不能重复的,value 可以重复 底层结构 key-value 进行存储,key-value 存入到 Set 中,再将 Set 装载到 HashMap pack…...

单点登录原理
允许跨域–>单点登录。 例如https://www.jd.com/ 同一个浏览器下:通过登录页面产生的cookie里的一个随机字符串的标识,在其他子域名下访问共享cookie获取标识进行单点登录,如果没有该标识则返回登录页进行登录。 在hosts文件下面做的域名…...

【随笔】AI大模型对软件开发的影响
随着 AI 技术的不断发展,AI大模型正在重塑软件开发流程,从代码自动生成到智能测试,未来,AI 大模型将会对软件开发者、企业,以及整个产业链都产生深远的影响。欢迎探讨 AI 是如何重塑软件开发的各个环节以及带来的新的流…...

JAVA中接口类和抽象类的区别
在Java中,接口(Interface)和抽象类(Abstract Class)都是实现抽象概念的方式,但它们之间存在一些关键的区别: 1. 定义和声明 抽象类: 使用abstract关键字声明。可以包含构造方法、成…...

【AI系统】昇腾 AI 架构介绍
昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼,也是 AI 计算能⼒的来源。华为,作为昇腾计算产业⽣态的⼀员,是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…...

uniapp input只输入一个字符就自动失去焦点
下面一段代码在每次输入后自动失去焦点,这是因为绑定的:key是动态的,输入改变后都需要重新刷新渲染,这是造成input只能输入一次就自动失去焦点的原因。 <view class"" v-for"(item, index) in phoneList" :key"…...

定时/延时任务-ScheduledThreadPoolExecutor的使用
文章目录 1. 概要2. 固定速率和固定延时2.1 固定速率2.2 固定延时 3. API 解释3.1 schedule3.2 固定延时 - scheduleWithFixedDelay3.2 固定速率 - scheduleWithFixedDelay 4. 小结 1. 概要 前三篇文章的地址: 定时/延时任务-自己实现一个简单的定时器定时/延时任…...

自编码器(一)
其实自编码器也可以算是自监督学习的一环,因 此我们可以再简单回顾一下自监督学习的框架。如图1.1所示,首先你有大量的没有标注的 数据,用这些没有标注的数据,你可以去训练一个模型,你必须设计一些不需要标注数据的 任…...

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)
Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway) 一、服务网关 1.1 什么是网关 在微服务架构中,服务网关是一个至关重要的组件。它作为系统的入口,负责接收客户端的请求,并将这些请求路由到相应的后端服务…...

40分钟学 Go 语言高并发:Go程序性能优化方法论
Go程序性能优化方法论 一、性能指标概述 指标类型关键指标重要程度优化目标CPU相关CPU使用率、线程数、上下文切换⭐⭐⭐⭐⭐降低CPU使用率,减少上下文切换内存相关内存使用量、GC频率、对象分配⭐⭐⭐⭐⭐减少内存分配,优化GC延迟指标响应时间、处理延…...

一文解析Kettle开源ETL工具!
ETL(Extract, Transform, Load)工具是用于数据抽取、转换和加载的软件工具,用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具备受用户推崇。本文就来详细说下Kettle。 一、Kettle是什么? Kettle 是一款开源的 ETL&#x…...

Tomcat新手成长之路:安装部署优化全解析(上)
文章目录 1.Tomcat简介2.Tomcat原理架构2.1.总体架构2.2.连接器2.2.1.具体功能2.2.2.IO模型2.2.3.逻辑处理流程2.2.4.内部处理流程 2.3.容器2.4.启动过程2.5.请求过程 3.Tomcat适用场景4.Tomcat与其他Web容器对比5.Tomcat安装和启动5.1.Java环境变量5.2.系统服务5.3.启动关闭 6…...

跟我学C++中级篇——通信的数据的传递形式
一、通信的数据传递 在开发程序中,无可避免的会进行数据的传递。这种传递方式有很多种,字节流、消息、Json、参数以及对象甚至可能的方法。那么在传递这些数据时,如何正确的采用更合适的方法,就成为了一个设计的首选的问题。 二…...

C语言 qsort及应用
qsort及应用 qsort:快速排序函数,需要引用stdlib.h文件. void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *, const void *) ); 参数: base:需要排序的数组 num:数据个数(数组长度) width:每个数据的字节数(sizeof(数据类型)) compa…...

【C语言】连接陷阱探秘(4):检查外部类型
目录 一、外部类型概述 1.1. 外部类型的重要性 1.2. 外部类型在C语言中的使用 1.3. 注意事项 二、常见的外部类型陷阱 2.1. 结构体和联合体的大小不匹配 2.1.1. 示例代码 2.1.2. 正确的做法 2.2. 枚举类型的值不匹配 2.3. 函数签名不一致 2.3.1. 函数签名不一致的问…...

打造双层环形图:基础与高级渐变效果的应用
在数据可视化领域,环形图因其独特的展示方式而广受欢迎。今天,我们将通过ECharts库来创建一个具有双层渐变效果的高级环形图。本文将详细介绍如何实现这种视觉效果。 1. 环形图基础 首先,我们需要了解环形图的基本构成。环形图由内外两个圆…...

【Git】Git 完全指南:从入门到精通
Git 完全指南:从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一,它帮助开发者高效地管理项目,支持分布式协作和版本控制。无论是个人项目还是团队开发,Git 都能提供强大的功能来跟踪、管理代码变更,并保障…...

【mac】mac自动定时开关机和其他常用命令,管理电源设置的工具pmset
一、操作步骤 1、打开终端 2、pmset 是用于管理电源设置的强大工具,我们将使用这个命令 (1)查询当前任务 pmset -g sched查看到我当前的设置是 唤醒电源开启在 工作日的每天早上8点半 上班时不用手动开机了 (2)删…...

【Leecode】Leecode刷题之路第62天之不同路径
题目出处 62-不同路径-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1:动态规划 思路: 代码示例:(Java&…...

基于深度学习的手势识别算法
基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…...

helm部署golang服务
Helm 是 Kubernetes 的一个包管理工具,类似于 Linux 中的 apt 或 yum。它使得在 Kubernetes 上部署和管理应用程序变得更加简单和高效。 安装 https://get.helm.sh/helm-v3.16.3-linux-amd64.tar.gz具体版本号可以在github上看到最新的版本号,然后替换上面链接来获取。gith…...

DreamCamera2相机预览变形的处理
最近遇到一个问题,相机更换了摄像头后,发现人像角度顺时针旋转了90度,待人像角度正常后,发现 预览时图像有挤压变形,最终解决。在此记录 一人像角度的修改 先放示意图 设备预览人像角度如图1所示,顺时针旋…...

Mysql误删表中数据与误删表的恢复方法
查看数据库是否开启binlog日志 mysql> show variables like %log_bin%; ------------------------------------------------------------------------ | Variable_name | Value | ------------------------------------…...

lapack、blas、solver库的区别和联系
LAPACK、BLAS、Solver 库 是数值计算领域的重要组成部分,它们各自的功能和设计目标有所不同,但也存在密切的联系。 1. 概述 库主要功能设计目标BLAS提供基础的线性代数操作,如向量运算、矩阵-向量乘法、矩阵-矩阵乘法等。提供高度优化的基础线性代数操作,作为更高级库的底层…...