CMake基础和命令介绍
CMake是一个跨平台的构建工具,它可以生成各种不同平台上的构建文件,例如Makefile或Visual Studio项目文件。以下是一些常用的CMake命令:
1. cmake_minimum_required:指定需要的最小CMake版本。
2. project:定义项目名称和版本号。
3. add_executable/add_library:添加可执行文件或动态/静态库。
4. target_link_libraries:链接库到目标文件中。
5. include_directories:添加头文件路径。
6. link_directories:添加库文件路径。
7. add_definitions:添加编译器定义。
8. set:设置变量的值。
9. if/else/elseif/endif:条件控制语句。
10. foreach:遍历列表。
11. add_custom_command / add_custom_target:自定义构建命令和目标。
12. install:安装生成的文件。
补充:
CMake语法中预设了一些常用变量:
- CMAKE_MAJOR_VERSION:cmake 主版本号;
- CMAKE_MINOR_VERSION:cmake 次版本号;
- CMAKE_C_FLAGS:设置 C 编译选项;
- CMAKE_CXX_FLAGS:设置 C++ 编译选项;
- PROJECT_SOURCE_DIR:工程的根目录;
- PROJECT_BINARY_DIR:运行 cmake 命令的目录;
- CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt 所在路径;
- CMAKE_CURRENT_BINARY_DIR:目标文件编译目录;
- EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
- LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置
(1)将多个CMake文件联系到一起
在CMake中,可以使用`include`命令将多个CMake文件联系到一起。
例如,假设我们有这样的目录结构:
```
project/
CMakeLists.txt
src/
CMakeLists.txt
main.cpp
libs/
library1/
CMakeLists.txt
src/
foo.cpp
include/
lib1/
foo.h
library2/
CMakeLists.txt
src/
bar.cpp
include/
lib2/
bar.h
```
我们需要在顶级CMake文件中包含所有子CMake文件。我们可以这样做:
```cmake
# Top-level CMakeLists.txt
# Include libraries
add_subdirectory(libs/library1)
add_subdirectory(libs/library2)
# Include source directory
add_subdirectory(src)
```
在每个库和源码目录中,有一个CMakeLists.txt文件来处理该目录中的内容。包含库的CMakeLists.txt看起来像这样:
```cmake
# libs/library1/CMakeLists.txt
# Define library
add_library(library1 src/foo.cpp)
target_include_directories(library1 PUBLIC include)
# Install library
install(TARGETS library1
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin)
install(DIRECTORY include/ DESTINATION include/lib1)
```
这将定义名为`library1`的库并将其包含路径添加到`PUBLIC`接口中。它还将该库安装到适当的目录,并将`include/lib1`安装到包含所有头文件的目录中。
源码目录的CMakeLists.txt可能如下所示:
```cmake
# src/CMakeLists.txt
# Define executable
add_executable(my_program main.cpp)
# Link libraries
target_link_libraries(my_program library1 library2)
```
这将定义一个可执行文件`my_program`,并将`library1`和`library2`链接到该文件中。
使用`include`命令在顶级CMakeLists.txt中包含所有子CMakeLists.txt文件,将确保所有代码都被正确构建并链接。
(2) CMake链接动态库和静态库
静态库:在CMake中,可以使用`add_library`命令来创建一个静态库,并使用`target_link_libraries`命令将其链接到可执行文件或其他库中。
假设我们有一个名为`my_library`的静态库,我们想将其链接到名为`my_executable`的可执行文件中。我们可以这样做:
```cmake
# CMakeLists.txt
# Define static library
add_library(my_library STATIC
library_source_1.cpp
library_source_2.cpp
)
# Define executable and link libraries
add_executable(my_executable
main.cpp
)
target_link_libraries(my_executable
my_library
)
```
在这个例子中,`add_library`命令创建一个名为`my_library`的静态库,并列出了该库的源文件。`add_executable`命令创建一个名为`my_executable`的可执行文件,并列出了该文件的源文件。`target_link_libraries`命令将`my_library`库链接到`my_executable`可执行文件中。
如果静态库是在不同目录中定义的,可以使用`find_library`命令来查找并链接该库:
```cmake
find_library(MY_LIBRARY my_library PATHS path/to/my/library)
target_link_libraries(my_executable ${MY_LIBRARY})
```
这将在`path/to/my/library`目录中查找名为`my_library`的静态库,并将其链接到`my_executable`可执行文件中。
静态库的链接顺序很重要,因为每个库都可能依赖于其他库。如果静态库A依赖于静态库B,则必须首先将静态库B链接到可执行文件或其他库中,然后再将静态库A链接到其后面。
动态库:
CMake可以使用`target_link_libraries`命令链接动态库。以下是一个将动态库链接到可执行文件中的示例:
```cmake
cmake_minimum_required(VERSION 3.0)
project(my_project)
# 设置可执行文件名称
set(EXECUTABLE_NAME "my_app")
# 设置源文件
set(SOURCE_FILES main.cpp)
# 查找动态库
find_library(MY_LIB my_lib PATHS /path/to/lib)
# 添加可执行文件
add_executable(${EXECUTABLE_NAME} ${SOURCE_FILES})
# 链接动态库
target_link_libraries(${EXECUTABLE_NAME} ${MY_LIB})
```
在这个示例中,`find_library`命令用于查找名为`my_lib`的动态库。`target_link_libraries`命令用于将`my_lib`动态库链接到可执行文件中。
相关文章:
CMake基础和命令介绍
CMake是一个跨平台的构建工具,它可以生成各种不同平台上的构建文件,例如Makefile或Visual Studio项目文件。以下是一些常用的CMake命令: 1. cmake_minimum_required:指定需要的最小CMake版本。 2. project:定义项目名…...
【matlab利用shp文件制作mask白化文件】
matlab白化文件 mask文件的作用matlab制作mask文件mask结果 mask文件的作用 地理信息绘图中的 “mask” 通常指的是遮罩或掩膜,用于在地图或图像上隐藏、高亮或标记特定区域。 数据可视化: 地理信息绘图 mask 可以用于突出显示特定地理区域,使…...
【LLM】解析pdf文档生成摘要
文章目录 一、整体思路二、代码三、小结Reference 一、整体思路 非常简单的一个v1版本 利用langchain和pdfminer切分pdf文档为k块,设置overlap等参数先利用prompt1对每个chunk文本块进行摘要生成,然后利用prompt2对多个摘要进行连贯组合/增删模型可以使…...
方案:AI边缘计算智慧工地解决方案
一、方案背景 在工程项目管理中,工程施工现场涉及面广,多种元素交叉,状况较为复杂,如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时,需要提前报告࿰…...
【Python】【数据结构和算法】查找最大或最小的N个元素
除了直接排序,还可以利用heaq模块的nlargest()和nsmallest()方法,例如: >>> nums [3, 5, 2, 4, 1] >>> smallest heapq.nsmallest(3, nums) >>> print(smallest) [1, 2, 3] >>> largest heapq.nlarg…...
C++day1(笔记整理)
一、Xmind整理: 二、上课笔记整理: 1.第一个c程序:hello world #include <iostream> //#:预处理标识符 //<iostream>:输入输出流类所在的头文件 //istream:输入流类 //ostream:输出流类using namespace std; //std&#x…...
关于chromedriver.exe一系列问题的解决办法
最新 chromedriver.exe下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable 下载最新版本的 chromedriver.exe 将其解压在 python.exe 同目录下,以及Chrome 的路径下 例如: C:\Program Files\Google\Chrome\Applicati…...
css-选择器、常见样式、标签分类
CSS CSS简介 层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可…...
三星申请新商标:未来将应用于智能戒指,作为XR头显延伸设备
三星最近向英国知识产权局提交了名为“Samsung Curio”的新商标,这预示着三星正积极扩展可穿戴设备生态。该商标被分类为“Class 9”,这表明它有可能被用于未来的智能戒指。 据报道,三星计划将智能戒指作为XR头显设备的延伸,与苹果…...
0201hdfs集群部署-hadoop-大数据学习
文章目录 1 前言2 集群规划3 hadoop安装包上传与安装3.1 上传解压 4 hadoop配置5 从节点同步和环境变量配置6 创建用户7 集群启动8 问题集8.1 Invalid URI for NameNode address (check fs.defaultFS): file:/// has no authority. 结语 1 前言 下面我们配置下单namenode节点h…...
DevOps中的持续测试优势和工具
持续测试 DevOps中的持续测试是一种软件测试类型,它涉及在软件开发生命周期的每个阶段测试软件。持续测试的目标是通过早期测试和经常测试来评估持续交付过程的每一步的软件质量。 DevOps中的持续测试流程涉及开发人员、DevOps、QA和操作系统等利益相关者。 持续…...
函数-C语言(初阶)
目录 一、什么是函数 二、函数的分类 2.1 库函数 2.2 自定义函数 三、函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 四、函数的调用 4.1 传值调用 4.2 传址调用 五、函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问…...
elementuiplus设置scroll-to-error之后 提示被遮挡的解决方案
项目场景: 普通的头部固定,中间滑动的布局,中间内容有表单,提交校验不通过时滚动到第一个错误项 问题描述 elementuiplus的scroll-to-error设置之后是局部滚动 当头部内容层级高于中间表单的时候,错误会被遮挡。 ---…...
vue中将新添加的div标签自动定位到可视区域内
可以结合使用Vue的ref和scrollIntoView()方法来实现 <template><div><button click"addDiv">添加新的<div>标签</button><div ref"container" class"container"><div v-for"(item,inde…...
Vue3笔记——(尚硅谷张天禹Vue笔记)
Vue3 Vue3简介 1.Vue3简介 .2020年9月18日,Vue.js发布3.0版本,代号: One Piece(海贼王)。耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者 . github上的tags地址: https://github.com/vuejs/vue-next/releases/tag/v3.0.0 2.Vue3带来了什么 .性能…...
正则表达式一小时学完
闯关式学习Regex 正则表达式,我感觉挺不错的,记录一下。 遇到不会的题,可以评论交流。 真的很不错 链接 Regex Learn - Step by step, from zero to advanced....
上门服务系统|上门服务小程序如何提升生活质量?
上门服务其实就是本地生活服务的升级,上门服务包含很多行业可以做的。例如:厨师上门、上门家电维修、跑腿等等。如今各类本地化生活服务越来越受大家的喜爱。基于此市场愿景,我们来谈谈上门服务系统功能。 一、上门服务系统功能 1、预约服务…...
系统报错msvcp120.dll丢失的解决方法,常见的三种解决方法
今天为大家讲述关于系统报错msvcp120.dll丢失的解决方法。在这个信息爆炸的时代,我们每个人都可能遇到各种各样的问题,而这些问题往往需要我们去探索、去解决。今天,我将带领大家走进这个神秘的世界,一起寻找解决msvcp120.dll丢失…...
数据库备份工具有哪些
本文主要介绍下数据库备份工具。 数据库备份工具有很多种,以下是一些常见的数据库备份工具: mysqldump:MySQL官方提供的命令行备份工具,适用于MySQL和MariaDB数据库。它可以将数据库导出为SQL文件,方便进行备份和恢复…...
Sentinel流量控制与熔断降级
📝 学技术、更要掌握学习的方法,一起学习,让进步发生 👩🏻 作者:一只IT攻城狮 ,关注我,不迷路 。 💐学习建议:1、养成习惯,学习java的任何一个技术…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...
Python爬虫实战:研究Restkit库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的有价值数据。如何高效地采集这些数据并将其应用于实际业务中,成为了许多企业和开发者关注的焦点。网络爬虫技术作为一种自动化的数据采集工具,可以帮助我们从网页中提取所需的信息。而 RESTful API …...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
