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 表示步长

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql中(基于GTID方式)实现主从复制,单主复制详细教程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

精密电路设计中的高精电阻:分流电阻

精密电路设计要求电路元件具有极高的精度和稳定性。在这些设计中&#xff0c;分流电阻扮演着至关重要的角色。本文将探讨分流电阻的基本原理、选择标准、应用场景以及在现代精密电路设计中的重要性。 在电子测量和控制领域&#xff0c;电流的精确测量是实现电路精确控制的关键。…

FPGA:3-8译码器的设计

1、什么是3-8译码器&#xff1f; 3-8译码器&#xff0c;顾名思义&#xff0c;三个输入&#xff0c;八个输出&#xff0c;构成3-8译码器。根据二进制特性&#xff0c;三位二进制数有八种可能&#xff0c;对应的真值表如下所示(该译码器输出低电平有效)&#xff1a; 3-8译码器(…

关于使用宝兰德bes中间件进行windows部署遇到的问题——license不存在

报错信息 日志文件中是这么报错的 遇到的具体情况&#xff1a; 实例按照**的文档手册正常步骤下去节点部署的时候没有报错&#xff0c;成功启动&#xff0c;但是日志里会有报错信息&#xff0c;也是license不存在实例创建的时候失败了&#xff0c;报错信息如下所示 解决方法…

Fork软件笔记:一键拉取仓库所有模块

Fork是一个好用的git工具&#xff0c;只是没有中文而已&#xff08;不过不用翻译也能看使用&#xff09;。 工具下载地址&#xff1a;https://fork.dev/ 界面展示&#xff1a; 当项目中仓库模块比较多时&#xff0c;可以看到每个模块都是一个分页&#xff0c;每一个都要手动切换…

ML.NET:一个.NET开源、免费、跨平台的机器学习框架

前言 今天大姚给大家分享一个.NET开源、免费、跨平台&#xff08;支持Windows、Linux、macOS多个操作系统&#xff09;的机器学习框架&#xff1a;ML.NET。并且本文将会带你快速使用ML.NET训练一个属于自己的图像分类模型&#xff0c;对图像进行分类。 ML.NET框架介绍 ML.NET…

ubuntu一些好用的开发工具及其配置

1 终端模糊搜索fzf https://github.com/junegunn/fzf 输入某命令&#xff0c;比如 conda &#xff0c;按下ctrlR&#xff0c;会显示和该命令匹配的历史命令的列表 有了这个工具再也不用记忆太复杂的命令&#xff0c;只需要知道大概几个单词&#xff0c;输入即可搜索。 其搜索…

IP地址专用SSL证书申请指南——六步完成

IP地址SSL证书是一种专门设计用于IP地址的SSL/TLS证书&#xff0c;部署IP地址SSL证书可以实现IP地址HTTPS加密。 一&#xff1a;前提条件 1&#xff1b;申请IP地址SSL证书,必须拥有这个IP地址的管理权限 2&#xff1b;非内网IP&#xff0c;以下是常见的内网IP字段 10.0.0.0…

计算机网络知识点总结————物理层

前言 一、物理层的基本概念 物理层解决什么问题 物理层的主要特性 二、传输媒体 导引型传输媒体 同轴电缆 双绞线 光纤 非导引型传输媒体 三、数据通信的基础知识 1.术语 2.编码方式 总结 前言 我站在清醒和麻木的边缘&#xff0c;不能堕落也不能解脱 一、物理层的…

鸿蒙OpenHarmony Native API【raw_dir.h与raw_file.h】 头文件

raw_dir.h Overview Related Modules: [Rawfile] Description: 提供rawfile目录相关功能 功能包括遍历和关闭rawfile目录 Since: 8 Version: 1.0 Summary Typedefs Typedef NameDescription[RawDir]typedef struct [RawDir] 提供对rawfile目录的访问 Functions Fun…

算法-KMP字符串匹配

题目一 解题思路 KMP算法详解 详解next数组 next[i] 就是使子串 s[0…i] 有最长相等前后缀的前缀的最后一位的下标。 总体来说解next数组和模板串匹配的过程很相似&#xff0c;触类旁通 代码模板 #include<iostream> using namespace std; const int N1e510; char …

AI绘画入门实践 | Midjourney:使用 --ar 控制图片宽高比

参数 Aspect ratio&#xff0c;缩写为 --ar&#xff0c;作用是设置生成图像的宽高比。 使用格式&#xff1a;--ar 宽:高 futuristic portrait of a beautiful human-droid hybrid woman --ar 16:9 futuristic portrait of a beautiful human-droid hybrid woman --ar 9:16 你也…

使用axios请求后端的上传图片接口

安装axios npm install axios 创建input文件上传标签 <input type"file" name"" id"" change"handleChange" /> 使用axios请求后端的图片上传接口 function handleChange(val) {// new FormData() js内置构造函数&#xff0c…

力扣高频SQL 50 题(基础版)第一题

文章目录 力扣高频SQL 50 题&#xff08;基础版&#xff09;第一题1757.可回收且低脂的产品题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图&#xff1a; 力扣高频SQL 50 题&#xff08;基础版&#xff09;第一题 1757.可回收且低脂的产品 题目说…

面试常考Linux指令

文件权限 操作系统中每个文件都拥有特定的权限、所属用户和所属组。权限是操作系统用来限制资源访问的机制&#xff0c;在 Linux 中权限一般分为读(readable)、写(writable)和执行(executable)&#xff0c;分为三组。分别对应文件的属主(owner)&#xff0c;属组(group)和其他用…

PostgreSQL的学习心得和知识总结(一百四十九)|psql 的使用技巧:设置、预设、回显和已保存的查询

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

Harmony Next -- 图片选择库:宫格展示、全屏预览

hm_image_select_view OpenHarmony三方库中心仓&#xff1a;https://ohpm.openharmony.cn/#/cn/detail/image_select_view 介绍 Harmony Next 图片选择库&#xff0c;可设置最大选择数量、单行显示数量、横向竖向间隔&#xff1b;点击图片后全屏预览 软件架构 Harmony nex…

什么是STP环路保护

在运行生成树协议的网络中&#xff0c;根端口和其他阻塞端口状态是依靠不断接收来自上游设备的BPDU维持。当由于链路拥塞或者单向链路故障导致这些端口收不到来自上游交换设备的BPDU时&#xff0c;设备会重新选择根端口。原先的根端口会转变为指定端口&#xff0c;而原先的阻塞…

2024年NVIDIA A800最新的价格是多少?

英伟达&#xff08;NVIDIA&#xff09;的A800作为一款专为深度学习应用设计的GPU芯片&#xff0c;自发布以来便受到了市场的广泛关注。其价格在不同时间段和销售渠道中有所波动&#xff0c;但总体而言&#xff0c;A800的售价较为高昂&#xff0c;远超普通消费级显卡。 一、价格…

(leetcode学习)110. 平衡二叉树

给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;false示例 3&#xff1a; 输入&#xff1…