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

CMakeList学习笔记

设置项目:project

        

project(planning VERSION 1.0.0 LANGUAGES CXX) # 项目的名字 版本 1.1.0 编程语言 CXX

设置包含目录:include_directories、targer_include_directories

 

设置编译类型:add_executable、add_library

        add_executable(demo demo.cpp) #生成可执行文件
        add_library(common STATIC util.cpp) #生成静态库
        add_libary(common SHARED util.cpp) #生成动态库

add_library默认生成静态库,通过以上命令生成文件名称

在Linux平台:

        demo (可执行文件)

        libcommon.a (静态库)

        libcommon.so (动态库)

在window平台:

        demo.exe (可执行文件)

        common.lib (静态库)

        common.dll (动态库)

静态库与动态库的区别看Cmakelist知识总结-CSDN博客,这个博主讲的清楚。

总计如下:两者区别在链接阶段,静态链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中,即在内存中拷贝一份;动态链接在内存中只有一份,但仍需要共享库的支持。

设置变量的值 :set(变量名 变量值) 

        例:set(SRC_LIST main.cpp)  设置SRC_LIST的值为main.cpp

        例:set( CMAKE_BUILD_TYPE “Debug” ) 设置 cmake 编译模式

添加可执行文件或库:add_executable

        例:add_executable(my_program main.cpp)

        可结合set使用

        

添加依赖项和链接库:target_link_libraries和include_libraries

两个命令的作用对象不同:

include_libraries 命令用于指定项目中所有目标(包括可执行文件和库)的头文件搜索路径。

target_include_libraries 命令用于指定特定的目标(target)(可执行文件或库)的头文件搜索路径。

target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)

方法一:通过绝对路径指定链接库的位置

        例:target_link_libraries(MyTarget PUBLIC path1 path2 ...)

        PRIVATE:私有的,其他链接到my_program的库无法使用

        PUBLIC:公有的,其他链接到my_program的库可以使用

        命令中未指定任何限定符,默认情况下将应用 PUBLIC 限定符

方法二:通过相对路径指定链接库的位置

        target_link_libraries(demo ${CMAKE_CURRENT_SOURCE_DIR}/libs/libface.a)

        # ${CMAKE_CURRENT_SOURCE_DIR}/libs/mylibrary.lib 是相对于当前源代码目录的相对路径,指定了要链接的库文件位置

方法三(比较常用):使用自定义变量指定链接库的位置

        set(MY_LIBRARY_PATH /path/to/custom/lib)

        target_link_libraries(MyExecutable PRIVATE ${MY_LIBRARY_PATH}/libmylibrary.so)

方法四:使用 find_library() 命令查找链接库并且进行链接接操作

         #find_library() 命令用于在指定的路径 /path/to/custom/lib 中查找名为 mylibrary 的库文件libmylibrary.so,并将结果保存在变量 MY_LIBRARY 中。然后,可以使用该变量来链接库。
        find_library(MY_LIBRARY NAMES mylibrary PATHS /path/to/custom/lib)
        target_link_libraries(MyExecutable PRIVATE ${MY_LIBRARY})

link_libraries(library1 library2)

link_libraries 命令的语法是直接列出需要链接的库的名称,多个库之间用空格分隔。

更适用于一次性链接多个库,并且不需要精细的目标控制的情况。它适用于简单的项目或需要快速链接库的情况。

# 记住唯一一种就行,target_link_libraries万能链接,要写在add_executable之后,作用于指定的目标。

添加子目录 :add_subdirectory

        add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

查找指定依赖库文件:find_xxx

find_library() 用于查找库文件的路径 

# 用于在系统或用户指定的路径 /path/to/custom/lib 中查找指定的库文件 libmylibrary.so,并将结果保存在变量 MY_LIBRARY中
# 通常用于查找并指定需要链接的库文件的路径,以便在后续的链接阶段使用
# NAMES 可选参数
find_library(MY_LIBRARY NAMES mylibrary PATHS /path/to/custom/lib)
 
# 使用 MY_LIBRARY 作为默认的库文件名称进行查找,使用默认的系统搜索路径 /usr/lib, /usr/local/lib, /lib(/lib待验证)
find_library(MY_LIBRARY)

find_path() 用于查找头文件或文件夹的路径 

# 用于在系统或用户指定的路径 /path/to/include1 /path/to/include2 中查找指定的头文件 myheader.h(或文件夹),并将结果保存在变量HEADER_PATH中
#  通常用于查找所需的头文件路径,以便在编译阶段使用
find_path(HEADER_PATH myheader.h PATHS /path/to/include1 /path/to/include2)

find_package() 用于查找和导入外部包的配置信息。

find_package命令有两种工作模式,这两种工作模式的不同决定了其搜包路径的不同:

  • Module模式(默认工作模式

        # Module模式基本语法

        find_package(<package_name> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [COMPONENTS <component1> <component2> ...])

        <package_name> 必填参数;需要查找的包名,注意大小写。例如 OpenCV、Boost 等

version 可选参数;指定所需的版本号

常见选项包括:

        EXACT 可选参数;要求找到的包的版本与指定的版本完全匹配,必须完全匹配的版本而不是兼容版本

        QUIET 可选参数; 静默模式,不会显示详细的查找信息,表示如果查找失败,不会在屏幕进行输出

        REQUIRED 可选参数;要求找到指定的包,如果找不到会产生错误,停掉整个CMake。而如果不指定REQUIRED则CMake会继续执行,必须检查找到的包的版本是否和version兼容

        COMPONENTS 可选字段; 指定要加载的包的组件,如果有任何一个找不到就算失败

MODULE 可选字段;“如果Module模式查找失败则回退到Config模式进行查找”,但是假如设定了MODULE选项,那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找。

  • Config模式(高级工作模式

        只有在find_package()中指定CONFIGNO_MODULE等关键字,或者Module模式查找失败后才会进入到Config模式

        # 其中具体查找库并给XXX_INCLUDE_DIRS和XXX_LIBRARIES两个变量赋值的操作由XXXConfig.cmake模块完成
        # 两种模式看起来似乎差不多,不过CMake默认采取Module模式,如果Module模式未找到库,才会采取Config模式。如果XXX_DIR路径下找不到XXXConfig.cmake文件,则会找/usr/local/lib/cmake/XXX/中的XXXConfig.cmake文件。总之,Config模式是一个备选策略。通常,库安装时会拷贝一份XXXConfig.cmake到系统目录中,因此在没有显式指定搜索路径时也可以顺利找到。
        # 具体查找顺序为:
        # 1、名为<PackageName>_DIR的CMake变量或环境变量路径默认为空。
        # 这个路径是非根目录路径,需要指定到<PackageName>Config.cmake文件所在目录才能找到。
        # 2、名为CMAKE_PREFIX_PATH、CMAKE_FRAMEWORK_PATH、CMAKE_APPBUNDLE_PATH的CMake变量或环境变量路径根目录,默认都为空。
        #注意如果你电脑中安装了ROS并配置好之后,你在终端执行echo $CMAKE_PREFIX_PATH会发现ROS会将CMAKE_PREFIX_PATH这个变量设置为ROS中的库的路径/opt/ros/noetic,意思是会首先查找ROS安装的库,如果恰好你在ROS中安装了OpenCV库,就会发现首先找到的是ROS中的OpenCV,而不是你自己安装到系统中的OpenCV。
        # 3、PATH环境变量路径根目录,默认为系统环境PATH环境变量值。
        # 其实这个路径才是Config模式大部分情况下能够查找到安装到系统中各种库的原因。
        # 这个路径的查找规则为:遍历PATH环境变量中的各路径,如果该路径如果以bin或sbin结尾,则自动回退到上一级目录得到根目录。

打印:message

message(打印内容)

message(STATUS "OpenCV library status:")

STATUS 是打印 -- 用来区分这是完整运行一条语句后的分割

例:find_package(Eigen3 REQUIRED)

        message(STATUS "Eigen3_INCLUDE_DIR = ${EIGEN3_INCLUDE_DIR}")

结果为:

        # 加了STATUS

        -- Eigen3_INCLUDE_DIR = /usr/include/eigen3

        # 没加STATUS

        Eigen3_INCLUDE_DIR = /usr/include/eigen3

添加编译选项

# 添加编译选项(add_definitions的功能和C/C++中的#define是一样的)
add_definitions(编译选项)
 
# 添加编译选项,包括使用C++11标准、启用调试信息和生成位置无关代码
add_compile_options(-std=c++11 -g -fPIC)

设定最低版本

        例:cmake_minimum_required(VERSION 3.4.0)

条件控制

 if…elseif…else…endif

逻辑判断和比较:
        if (expression):expression 不为空(0,N,NO,OFF,FALSE,NOTFOUND)时为真
        if (not exp):与上面相反
        if (var1 AND var2)
        if (var1 OR var2)
        if (COMMAND cmd):如果 cmd 确实是命令并可调用为真
        if (EXISTS dir) if (EXISTS file):如果目录或文件存在为真
        if (file1 ISNEWERTHAN file2):当 file1 比 file2 新,或 file1/file2 中有一个不存在时为真,文件名需使用全路径
        if (IS_DIRECTORY dir):当 dir 是目录时为真
        if (DEFINED var):如果变量被定义为真
        if (var MATCHES regex):给定的变量或者字符串能够匹配正则表达式 regex 时为真,此处 var 可以用 var 名,也可以用 ${var}
        if (string MATCHES regex)

数字比较:
        if (variable LESS number):LESS 小于
        if (string LESS number)
        if (variable GREATER number):GREATER 大于
        if (string GREATER number)
        if (variable EQUAL number):EQUAL 等于
        if (string EQUAL number)

字母表顺序比较:
        if (variable STRLESS string)
        if (string STRLESS string)
        if (variable STRGREATER string)
        if (string STRGREATER string)
        if (variable STREQUAL string)
        if (string STREQUAL string)

while ...endwhile 

        例:while(condition)
                ...
                endwhile

foreach...endforeach

        例:foreach(loop_var RANGE start stop [step])
                ...
                endforeach

        start 表示起始数,stop 表示终止数,step 表示步长

相关文章:

CMakeList学习笔记

设置项目&#xff1a;project project(planning VERSION 1.0.0 LANGUAGES CXX) # 项目的名字 版本 1.1.0 编程语言 CXX 设置包含目录&#xff1a;include_directories、targer_include_directories 设置编译类型&#xff1a;add_executable、add_library add_executable(demo d…...

将git默认的编辑器设置为vin

git默认编辑器现状 如下&#xff0c;很多linux发行版&#xff0c;未加修改的情况下&#xff0c;git的默认编辑器使用起来不太方便 Signed-off-by: root <rootxxx.COM># Please enter the commit message for your changes. Lines starting # with # will be ignored, a…...

ros2_control 6 自由度机械臂

系列文章目录 前言 ros2_control 是一个实时控制框架&#xff0c;专为普通机器人应用而设计。标准的 c 接口用于与硬件交互和查询用户定义的控制器命令。这些接口增强了代码的模块化和与机器人无关的设计。具体的应用细节&#xff0c;例如使用什么控制器、机器人有多少个关节以…...

Python 在自动化中的实际应用:用 Python 简化繁琐任务

文章目录 1、概述2、自动化文件和目录管理3.数据处理与分析4.网页爬虫5. 系统管理6。定时任务7.结语 1、概述 这篇文章将深入探讨Python在自动化中的实际应用&#xff0c;帮助您用Python简化繁琐任务。 我们将从多个方面入手&#xff0c;展示如何利用Python进行文件管理、数据…...

解释 Spring 框架的核心模块(如 IoC 容器、AOP )及其工作原理。描述如何使用 Spring Boot 快速搭建一个 RESTful Web服务?

Spring框架是一个广泛使用的Java企业级应用程序开发框架&#xff0c;它提供了一系列的模块来帮助开发者构建健壮、可测试、可维护的应用程序。 其中&#xff0c;最核心的模块包括IoC容器和AOP&#xff08;Aspect Oriented Programming&#xff0c;面向切面编程&#xff09;。 …...

数据分析详解

一、数据分析教程 1. 入门教程 在线课程&#xff1a;如Coursera、Udemy、网易云课堂等平台提供了大量数据分析的入门课程&#xff0c;涵盖统计学基础、Python/R语言编程、数据可视化等内容。书籍推荐&#xff1a;《Python数据分析实战》、《R语言实战》等书籍是数据分析入门的…...

SpringCloud之@FeignClient()注解的使用方式

FeignClient介绍 FeignClient 是 Spring Cloud 中用于声明一个 Feign 客户端的注解。由于SpringCloud采用分布式微服务架构&#xff0c;难免在各个子模块下存在模块方法互相调用的情况。比如订单服务要调用库存服务的方法&#xff0c;FeignClient()注解就是为了解决这个问题的…...

20.rabbitmq插件实现延迟队列

问题 前面谈到基于死信的延迟队列&#xff0c;存在的问题&#xff1a;如果第一个消息延时时间很长&#xff0c;而第二个消息延时时间很短&#xff0c;第二个消息并不会优先得到执行。 下载插件 地址&#xff1a;https://github.com/rabbitmq/rabbitmq-delayed-message-excha…...

TS如何处理js模块的类型?

现在很多插件都直接用ts开发了&#xff0c;本身包含了类型定义常见的第三方插件&#xff0c;都有’types/xxx’包&#xff0c;安装即可使用其他的&#xff0c;可通过declare module定义类型 比如&#xff1a; // someModule.js export function greet(name) {return Hello, $…...

GPS定位系统(VUE框架)

源码下载&#xff1a;小宅博客网 博主之前写的《GPS定位系统&#xff08;MVC框架&#xff09;》版本&#xff0c;并没有做到前后端分离&#xff0c;不太适合多人协作开发&#xff0c;这边博主分享一个基于asp.net web api vue3的GPS定位系统框架&#xff0c;本框架继承了MVC框…...

分布式光伏并网AM5SE-IS防孤岛保护装置介绍——安科瑞 叶西平

产品简介 功能&#xff1a; AM5SE-IS防孤岛保护装置主要适用于35kV、10kV及低压380V光伏发电、燃气发电等新能源并网供电系统。当发生孤岛现象时&#xff0c;可以快速切除并网点&#xff0c;使本站与电网侧快速脱离&#xff0c;保证整个电站和相关维护人员的生命安全。 应用…...

神奇的方法解决Navicat闪退

原因 打开Navicat操作上面的工具等就会闪退&#xff0c;原因竟然是屏幕划词&#xff01;&#xff01;&#xff01; 解决方法 看别人提到有道词典的划词功能的原因 我没有安装有道词典&#xff0c;但我安装豆包&#xff0c;它也有划词翻译的功能&#xff0c;关闭即可...

openmv学习笔记(24电赛笔记)

感光元件 openmv采用小孔摄像模式&#xff0c;将图像映射到感光原件上面&#xff0c;来传递图片&#xff0c;通过图片快速的刷新行成视频&#xff0c;在IDE中通过对感光原件的编辑可以控制视频的效果。 重置感光元件到默认状态 import sensor #导入感光元件这个库sensor.res…...

Linux shell编程学习笔记67: tracepath命令 追踪数据包的路由信息

0 前言 网络信息是电脑网络信息安全检查中的一块重要内容&#xff0c;Linux和基于Linux的操作系统&#xff0c;提供了很多的网络命令&#xff0c;今天我们研究tracepath命令。 Tracepath 在大多数 Linux 发行版中都是可用的。如果在你的系统中没有预装&#xff0c;请根据你的…...

生鲜云订单零售系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;订单评价管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#…...

BLE自适应跳频算法详解

前言 &#xff08;1&#xff09;自适应跳频算法是相当的简单&#xff0c;小学生都能够看懂&#xff0c;而且网上已经有相当多的关于自适应跳频算法的介绍。既然如此&#xff0c;为什么我还要写这样一篇博客呢&#xff1f; &#xff08;2&#xff09;原因很简单&#xff0c;我发…...

[Meachines] [Easy] Beep Elastix-CMS-LFI

信息收集 IP AddressOpening Ports10.10.10.7TCP:22, 25, 80, 110, 111, 143, 443, 993, 995, 3306 $ nmap -p- 10.10.10.7 --min-rate 1000 -sC -sV Nmap scan report for 10.10.10.7 (10.10.10.7) Host is up (0.53s latency). Not shown: 65486 filtered tcp ports (no-…...

甘肃麻花:酥脆香甜的陇原美味

在甘肃的美食画卷中&#xff0c;甘肃麻花以其独特的魅力占据着重要的一席之地。甘肃食家巷麻花&#xff0c;那金黄酥脆的外形&#xff0c;宛如一件件精美的艺术品。每一根麻花的纹理都清晰可见&#xff0c;缠绕交织&#xff0c;散发着诱人的光泽。 制作甘肃麻花是一门传统的手艺…...

C语言刷题小记2

前言 本篇博客还是为大家分享一些C语言的OJ题目&#xff0c;如果你感兴趣&#xff0c;希望大佬一键三连。多多支持。下面进入正文部分。 题目1竞选社长 分析&#xff1a;本题要求我们输入一串字符&#xff0c;并且统计个数的多少&#xff0c;那么我们可以通过getchar函数来获…...

JavaScript图片轮播

代码在文章最后面&#xff08;含图片URL&#xff09; 实现功能 按向左按钮图片显示上一张按向右按钮图片显示下一张每隔2000毫秒显示下一张图底部三个圆点显示当前的图片的编号 实现流程 初始化图片数组 创建一个包含图片URL的数组&#xff0c;轮播时会通过这个数组来切换图…...

MSSQL注入前置知识

简述 Microsoft SQL server也叫SQL server / MSSQL&#xff0c;由微软推出的关系型数据库&#xff0c;默认端口1433 常见搭配C# / .net IISmssql mssql的数据库文件 数据文件&#xff08;.mdf&#xff09;&#xff1a;主要的数据文件&#xff0c;包含数据表中的数据和对象信息…...

idea一键为实体类赋值

file -> settings -> plugins -> marketplace 把这个插件装上 找个实体&#xff0c;选中&#xff0c;altenter进入edit界面 我是选择只保留右边这种生成方法&#xff0c;然后选择ok 返回到那个实体&#xff0c;选择&#xff0c;altenter generate生成...

秋招突击——7/24——知识补充——JVM类加载机制

文章目录 引言类加载机制知识点复习类的生命周期1、加载2、连接——验证3、连接——准备4、连接——解析5、初始化 类加载器和类加载机制类加载器类加载机制——双亲委派模型 面试题整理1、类加载是什么2、类加载的过程是什么3、有哪些类加载器&#xff1f;4、双亲委派模型是什…...

如何在 Microsoft SQL Server 中增加字段-完整指南

在使用 Microsoft SQL Server (MSSQL) 进行数据库管理时,添加新字段(列)是一项常见的任务。无论你是需要存储额外的信息,还是调整数据模型以适应新的业务需求,本指南都将帮助你轻松完成这项操作。 目录 1. 使用 T-SQL 添加字段2. 使用 SQL Server Management Studio (SSMS) 添加…...

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…...

随机点名器

练习1 package lx;import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.Random;/*需求&#xff1a;需求&#xff1a;有一个文件里面存储了班级同学的信息&#xff0c;每一个信息占一行。格式为&#xff1a;张三-男-23要求通过程序…...

添加动态云层

<template> <div class"topbox"> xx卫星管理 </div> <div class"selectbox"> <div class"title"> 卫星列表 </div> <el-table :data"tableData" style"width: 100%;height:230px;" …...

Spring Boot组成的分布式系统中实现日志跟踪

Spring Boot组成的分布式系统中实现日志跟踪 首发2024-07-25 08:54潘多编程 在分布式系统中&#xff0c;日志跟踪是一项非常重要的功能&#xff0c;它帮助开发者了解请求在整个系统中的流转过程&#xff0c;这对于调试、监控和故障排查至关重要。Spring Boot应用通常作为微服…...

GPT-4o Mini 模型的性能与成本优势全解析

GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8; &#x1f31f; GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8;摘要引言正文内容GPT-4o Mini 模型简介 &#x1f680;性能测试与对比 &#x1f4ca;应用场景 &#x1f310;自然语言处理对话系统内容生成 ✍️ &am…...

web前端 - HTML 基础知识大揭秘

HTML 大揭秘 什么是 HTML HTML&#xff08;Hyper Text Markup Language&#xff09;&#xff0c;中文译为超文本标记语言。其中&#xff0c;我们需要注意两个关键词。一个是 超文本&#xff0c;一个是 标记。所谓超文本&#xff0c;就是将不同空间的文字信息通过超链接的方式…...