当前位置: 首页 > news >正文

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边缘计算智慧工地解决方案

一、方案背景 在工程项目管理中,工程施工现场涉及面广,多种元素交叉,状况较为复杂,如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时,需要提前报告&#xff0…...

【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整理&#xff1a; 二、上课笔记整理&#xff1a; 1.第一个c程序&#xff1a;hello world #include <iostream> //#:预处理标识符 //<iostream>:输入输出流类所在的头文件 //istream:输入流类 //ostream:输出流类using namespace std; //std&#x…...

关于chromedriver.exe一系列问题的解决办法

最新 chromedriver.exe下载地址&#xff1a;https://googlechromelabs.github.io/chrome-for-testing/#stable 下载最新版本的 chromedriver.exe 将其解压在 python.exe 同目录下&#xff0c;以及Chrome 的路径下 例如&#xff1a; C:\Program Files\Google\Chrome\Applicati…...

css-选择器、常见样式、标签分类

CSS CSS简介 层叠样式表(英文全称&#xff1a;Cascading Style Sheets)是一种用来表现HTML&#xff08;标准通用标记语言的一个应用&#xff09;或XML&#xff08;标准通用标记语言的一个子集&#xff09;等文件样式的计算机语言。CSS不仅可以静态地修饰网页&#xff0c;还可…...

三星申请新商标:未来将应用于智能戒指,作为XR头显延伸设备

三星最近向英国知识产权局提交了名为“Samsung Curio”的新商标&#xff0c;这预示着三星正积极扩展可穿戴设备生态。该商标被分类为“Class 9”&#xff0c;这表明它有可能被用于未来的智能戒指。 据报道&#xff0c;三星计划将智能戒指作为XR头显设备的延伸&#xff0c;与苹果…...

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中的持续测试是一种软件测试类型&#xff0c;它涉及在软件开发生命周期的每个阶段测试软件。持续测试的目标是通过早期测试和经常测试来评估持续交付过程的每一步的软件质量。 DevOps中的持续测试流程涉及开发人员、DevOps、QA和操作系统等利益相关者。 持续…...

函数-C语言(初阶)

目录 一、什么是函数 二、函数的分类 2.1 库函数 2.2 自定义函数 三、函数的参数 3.1 实际参数&#xff08;实参&#xff09; 3.2 形式参数&#xff08;形参&#xff09; 四、函数的调用 4.1 传值调用 4.2 传址调用 五、函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问…...

elementuiplus设置scroll-to-error之后 提示被遮挡的解决方案

项目场景&#xff1a; 普通的头部固定&#xff0c;中间滑动的布局&#xff0c;中间内容有表单&#xff0c;提交校验不通过时滚动到第一个错误项 问题描述 elementuiplus的scroll-to-error设置之后是局部滚动 当头部内容层级高于中间表单的时候&#xff0c;错误会被遮挡。 ---…...

vue中将新添加的div标签自动定位到可视区域内

可以结合使用Vue的ref和scrollIntoView()方法来实现 <template><div><button click"addDiv">添加新的<div>标签</button><div ref"container" class"container"><div v-for"&#xff08;item,inde…...

Vue3笔记——(尚硅谷张天禹Vue笔记)

Vue3 Vue3简介 1.Vue3简介 .2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号: 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 正则表达式&#xff0c;我感觉挺不错的&#xff0c;记录一下。 遇到不会的题&#xff0c;可以评论交流。 真的很不错 链接 Regex Learn - Step by step, from zero to advanced....

上门服务系统|上门服务小程序如何提升生活质量?

上门服务其实就是本地生活服务的升级&#xff0c;上门服务包含很多行业可以做的。例如&#xff1a;厨师上门、上门家电维修、跑腿等等。如今各类本地化生活服务越来越受大家的喜爱。基于此市场愿景&#xff0c;我们来谈谈上门服务系统功能。 一、上门服务系统功能 1、预约服务…...

系统报错msvcp120.dll丢失的解决方法,常见的三种解决方法

今天为大家讲述关于系统报错msvcp120.dll丢失的解决方法。在这个信息爆炸的时代&#xff0c;我们每个人都可能遇到各种各样的问题&#xff0c;而这些问题往往需要我们去探索、去解决。今天&#xff0c;我将带领大家走进这个神秘的世界&#xff0c;一起寻找解决msvcp120.dll丢失…...

数据库备份工具有哪些

本文主要介绍下数据库备份工具。 数据库备份工具有很多种&#xff0c;以下是一些常见的数据库备份工具&#xff1a; mysqldump&#xff1a;MySQL官方提供的命令行备份工具&#xff0c;适用于MySQL和MariaDB数据库。它可以将数据库导出为SQL文件&#xff0c;方便进行备份和恢复…...

Sentinel流量控制与熔断降级

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...