针对于OB_GINS的CMakeList文件的深入学习

Project()——配置项目信息

project(CMakeTemplate VERSION 1.0.0 LANGUAGES C CXX DESCRIPTION "A cmake template project")
//通过project命令配置项目信息

project(项目名称 VERSION major.minor.patch.tweak )CMake会将对应的值分别赋值给以下变量:

PROJECT_VERSION, <PROJECT-NAME>_VERSION
PROJECT_VERSION_MAJOR, <PROJECT-NAME>_VERSION_MAJOR  //1
PROJECT_VERSION_MINOR, <PROJECT-NAME>_VERSION_MINOR  //0
PROJECT_VERSION_PATCH, <PROJECT-NAME>_VERSION_PATCH  //0
PROJECT_VERSION_TWEAK, <PROJECT-NAME>_VERSION_TWEAK

configure_file——配置自动生成版本头文件

configure_file指令

configure_file(src/c/cmake_template_version.h.in "${PROJECT_SOURCE_DIR}/src/c/cmake_template_version.h")

configure_file 指令通过读取输入文件中的内容,将 CMakeLists.txt 文件中的变量转变为 C/C++ 中可识别的宏定义,然后存入另一个文件中。

configure_file(<input> <output>
               [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
               [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
               //将input文件复制到output文件,并在输入文件内容中的变量,替换引用为@VAR@或${VAR}的变量值。每个变量引用将替换为该变量的当前值,如果未定义该变量,则为空字符串。

configure_file,复制一份输入文件到输出文件,替换输入文件中被@VAR@或者${VAR}引用的变量值。

如在cmake_template_version.h.in(input文件),内容如下:

#define CMAKE_TEMPLATE_VERSION_MAJOR @CMakeTemplate_VERSION_MAJOR@
#define CMAKE_TEMPLATE_VERSION_MINOR @CMakeTemplate_VERSION_MINOR@
#define CMAKE_TEMPLATE_VERSION_PATCH @CMakeTemplate_VERSION_PATCH@

那么执行CMakeList文件,,系统就会自动生成cmake_template_version.h(output文件),同时,将@CMakeTemplate_VERSION_MAJOR@替换成相应的值(经过CMakeList中的VERSION设置,最终 实现值与变量宏定义的对应)

#define CMAKE_TEMPLATE_VERSION_MAJOR 1
#define CMAKE_TEMPLATE_VERSION_MINOR 0
#define CMAKE_TEMPLATE_VERSION_PATCH 0

set(CMAKE_)指定程序语言版本形式

set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 11)

add_compile_options()配置编译的选项

add_compile_options(-Wall -Wextra -pedantic -Werror)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pipe -std=c99")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pipe -std=c++11")

通过设置变量CMAKE_C_FLAGS可以配置c编译器的编译选项
通过设置变量CMAKE_CXX_FLAGS配置针对c++编译器的编译选项
在add_compile_options()中:

-WALL选项——提供报警信息
通过add_compile_options命令,能够将其添加到所有的目标上

add_compile_options(-Wall)//将允许gcc提供的所有有用的报警信息,添加到所有的目标上

使用target_compile_options命令。这个命令只会添加到指定的目标上

target_compile_options(target PRIVATE -Wall)
//-Wall 编译选项只会被添加到my_target这个目标,而不会影响到其他的目标。

PRIVATE、PUBLIC、INTERFACE这些关键字的含义:

  1. PRIVATE:定义的target目标能够使用这些编译参数(-Wall等)
  2. PUBLIC:目标自己和其他依赖这个目标的目标都会使用这些编译参数。
  3. INTERFACE:只有依赖这个目标的目标会使用这些编译参数
    在这里插入图片描述

set(CMAKE_BUILD_TYPE Debug) 配置编译类型

设置变量CMAKE_BUILD_TYPE来配置编译类型——Debug、Release、RelWithDebInfo、MinSizeRel
在这里插入图片描述

message()函数的功能

在CMake中,message()函数用于向终端输出信息。
message函数的用法:message([] “message text” …)
往往mode参数如下:

  • STATUS: 输出的信息会被发送到CMake的状态消息流,这是message()函数的默认模式。在命令行上,这些消息通常会被显示出来,但在图形界面中,它们可能会被重定向到其他地方。
  • WARNING: 输出的信息会被发送到CMake的警告消息流。这些消息会被显示出来,并且会标记为警告。
  • AUTHOR_WARNING: 这是WARNING模式的一种变体,只有在CMAKE_SUPPRESS_DEVELOPER_WARNINGS变量为FALSE时才会产生警告。
  • SEND_ERROR: 输出的信息会被发送到CMake的错误消息流,但不会立即停止CMake的处理过程。
  • FATAL_ERROR: 输出的信息会被发送到CMake的错误消息流,并立即停止CMake的处理过程。
    在这里插入图片描述
    对于STATUS的举例:
    message(STATUS “Your message”)常常被用来输出构建过程中的状态信息
set(MY_VARIABLE "Hello, CMake!")//而set(变量引用  变量值)就是通过将"Hello, CMake!"的值通过MY_VARIABLE代替
message(STATUS "MY_VARIABLE is: ${MY_VARIABLE}")
//这个例子中message会输出一条状态信息:MY_VARIABLE is: Hello, CMake!
//${MY_VARIABLE}是CMake的变量引用语法,它会被替换为MY_VARIABLE变量的值

CMake中的option配置

option(<variable> "<help_text>" [value])
variable:定义选项名称
help_text:说明选项的含义
value:定义选项默认状态,一般是OFF或者ON,除去ON之外,其他所有值都为认为是OFF。
**自己编写的一个简单的option用于定义全局宏的运用程序**

通过终端控制操作option宏的开关

自己的CMakeList.txt文件的设置:
在这里插入图片描述
自己的main.ccp函数的配置:
在这里插入图片描述
通过模仿学习打捞的终端进行宏定义的开关的开启和关闭,实现最终主程序的宏定义的调用::
自己定义的TEST_DEFINE_OPTION=ON
在这里插入图片描述自己定义的TEST_DEFINE_OPTION=OFF
对于最终执行文件的输出如下:
请添加图片描述

动态库与静态库的区别

静态库:在编译程序时,直接将库中的代码链接到可执行程序中——这样使得可执行程序可以直接运行,但是造成内存空间的严重牺牲
动态库:编译程序时,可执行程序中只保存对应的函数引用表,只有到程序执行时,再链接对应的库。——这样使用的优点是在多个执行程序使用同一个库的时候,节省空间的内存,但是,链接操作,往往使得程序的运行速度变慢
大佬理解——学习

如何通过CMakeList编译静态库

实现math编译成静态库,命名为math
同时主函数main.cpp文件依赖math静态库

步骤1:

将项目路径src/c/math下的源文件编译为静态库——需要获得编译此静态库所需的所有文件的列表
file(GLOB_RECURSE) 是一个用来匹配指定路径下所有符合通配符条件的文件的命令。
GLOB_RECURSE递归查找目录下的所有文件file() 命令则可以用来获取文件列表
通过add_library命令编译名为math的静态库,库的类型是第二个参数STATIC指定的。

file(GLOB_RECURSE MATH_SOURCE_SET src/c/*cpp)
//这行代码的用途是:递归地查找 src 目录下所有以 .cpp 结尾的文件,并将它们存储在MATH_SOURCE_SET变量中。
add_library(math_static STATIC ${MATH_SOURCE_SET})

install函数的剖析:

install(<TYPE> files... DESTINATION <dir>
        [PERMISSIONS permissions...]
        [CONFIGURATIONS [Debug|Release|...]]
        [COMPONENT <component>]
        [OPTIONAL] [NAMELINK_ONLY|NAMELINK_SKIP])
  • <TYPE>:这是一个必选参数,它定义了我们要安装的内容的类型。这个参数可以是TARGETS(目标),FILES(文件),DIRECTORY(目录)等。
    
  • files…:这是一个或多个我们要安装的文件或目标。对于TARGETS,这将是我们在add_executable或add_library中定义的目标名称。对于FILES和DIRECTORY,这将是文件或目录的路径
  • DESTINATION :这是一个必选参数,它定义了我们要将文件或目标安装到哪个目录。
  • [PERMISSIONS permissions…]:这是一个可选参数,它允许我们定义安装的文件或目标的权限。如果我们不指定这个参数,CMake将使用默认的权限。
  • [CONFIGURATIONS [Debug|Release|…]]:这是一个可选参数,它允许我们定义在哪些构建配置中执行安装命令。如果我们不指定这个参数,CMake将在所有的构建配置中执行安装命令。
  • [COMPONENT ]:这是一个可选参数,它允许我们将安装的文件或目标分组到一个组件中。这个参数在创建安装包时非常有用。
  • [OPTIONAL]:这是一个可选参数,它允许我们定义如果文件或目标不存在,CMake是否应该继续执行安装命令。
  • [NAMELINK_ONLY|NAMELINK_SKIP]:这是一个可选参数,它只对库目标有效。它允许我们定义是否安装库的名字链接。

以上就是CMake的install命令的基本结构和各个参数的含义。在理解了这些基本概念后,我们就可以开始使用这个命令来安装我们的文件和目标了。在接下来的小节中,我们将深入探讨如何使用这个命令来安装目标和文件,以及如何管理安装目录。
install函数详细解释

在install执行之前,我首先将CMAKE_INSTALL_PREFIX默认的/usr/local路径改成了当前路径下的src文件夹
参考CMAKE_INSTALL_PREFIX路径更改设置

set(CMAKE_INSTALL_PREFIX "/home/zhaobojun/CLionProjects/MyZBBJ/src")

然后执行install命令——然后我通过install中的files命令——安装所需要的头文件到我的DESTINATION地址

install(FILES ${MATH_HEADER_FILE} DESTINATION include/*.h)

请添加图片描述
最终src/下面包含的文件夹为:
请添加图片描述
这里注意我犯错误的一点在于:在cmake … | make | make install 以后才能成功执行install安装文件

cmake ..
make 
make install 
//我想笑死,我一直没有install 然后排查了半天才明白

参考message 信息打印设置
参考宏定义add_defination设置
linux之cmake 为了阅读mysql安装中的编译细节
CMake之install方法的使用
CMake简单案例
插入大佬博客以表示尊重

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

家庭网络防御系统搭建-将NDR系统的zeek日志集成到securit yonion

在前面的文章中安装了zeek,这里&#xff0c;安装了securityonion&#xff0c;这里&#xff0c;本文讲述如何将zeek生成的日志发送到siem security onion之中。 所有日志集成的步骤分为如下几步&#xff1a; 日志收集配置日志发送接收日志解析配置日志展示配置 ZEEK日志收集配…

购买国外虚拟主机应该怎么支付

国外虚拟主机支付&#xff0c;大多接受visa信用卡支付方式&#xff0c;如果用一张visa信用卡相对会方便很多&#xff0c;此外像Skrill、PayPal、比特币等&#xff0c;部分虚拟主机服务商也接受&#xff0c;另外还有小部分服务商接受支付宝、微信形式。 美国虚拟主机&#xff0…

大厂高频面试题复习JAVA学习笔记-学习路线

对于应届生&#xff0c;要找到一份java工作&#xff0c;你得大概学会&#xff1a; java基础&#xff1a;javase、jvm、juc、gc、mysql、jdbc&#xff0c;计网计组 Java微服务基础Maven→Gradle→Spring6→SpringMVC→MyBatis→MyBatisPlus→SSM->Redis7->SpringBoot2-&…

matlab:有限差分求解纳维尔(Navier)边界的双调和(Biharmonic)方程,边值为零

我们考虑如下形式的双调和方程的数值解 其中&#xff0c;Ω是欧氏空间中的多边形或多面体域&#xff0c;在其中&#xff0c;d为维度&#xff0c;具有分段利普希茨边界&#xff0c;满足内部锥条件&#xff0c;f(x) ∈ L2(Ω)是给定的函数&#xff0c;∆是标准的拉普拉斯算子。算…

飞腾银河麒麟(ARM架构)离线安装MySql8.0.28版本

下载安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 解压后上传到服务器(或者直接上传到服务器用tar -zxvf xxx.tar命令解压) 卸载mariadb 卸载命令&#xff1a;yum remove mariadb-server mariadb 检查是否还有未删除的包&#xff1a; rpm -…

计算机视觉——引导APSF和梯度自适应卷积增强夜间雾霾图像的可见性算法与模型部署(C++/python)

摘要 在夜间雾霾场景中&#xff0c;可见性经常受到低光照、强烈光晕、光散射以及多色光源等多种因素的影响而降低。现有的夜间除雾方法常常难以处理光晕或低光照条件&#xff0c;导致视觉效果过暗或光晕效应无法被有效抑制。本文通过抑制光晕和增强低光区域来提升单张夜间雾霾…

掌握网络抓取技术:利用RobotRules库的Perl下载器一览小红书的世界

引言 在信息时代的浪潮下&#xff0c;人们对于获取和分析海量网络数据的需求与日俱增。网络抓取技术作为满足这一需求的关键工具&#xff0c;正在成为越来越多开发者的首选。而Perl语言&#xff0c;以其卓越的文本处理能力和灵活的特性&#xff0c;脱颖而出&#xff0c;成为了…

LabVIEW厂房漏水检测监控系统

LabVIEW厂房漏水检测监控系统 随着信息技术和智能制造的快速发展&#xff0c;对于精密仪器和重要物品存放场所的环境监控日益重要&#xff0c;特别是防止漏水带来的潜在风险。漏水不仅可能导致珍贵资料或仪器的损坏&#xff0c;还可能引发安全事故&#xff0c;给企业和研究机构…

C语言 | 字符函数和字符串函数

目录&#xff1a; 1. 字符分类函数 2. 字符转换函数 3. strlen的使用和模拟实现 4. strcpy的使用和模拟实现 5. strcat的使用和模拟实现 6. strcmp的使用和模拟实现 7. strncpy函数的使用 8. strncat函数的使用 9. strncmp函数的使用 10. strstr的使用 11. strtok函…

数据库 06-03 时间戳,多版本MVCC,快照隔离,幻读

01.什么是时间戳 “时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 02.用时间戳实现调度 定义 数据库给予一个事务一个时…

美国B2987A是德科技静电计

181/2461/8938产品概述&#xff1a; 图形皮安计/静电计&#xff0c;可自信地测量低至0.01 fA和高达10 PΩ的电流 是德科技B2981A和B2983A毫微微/皮安计以及B2985A和B2985A静电计/高阻计不仅提供同类最佳的测量性能&#xff0c;还提供前所未有的功能来最大限度地提高您的测量信…

网络广播系统是什么?网络广播的作用及应用

网络广播系统是什么?网络广播的作用及应用 商场广播的目的&#xff1a;提醒人员有序、监控配合点对点呼叫、物品遗失广播、背景音乐防噪、紧急情况呼叫等等&#xff0c;各个场景有各个场景的需求模式&#xff0c;广播系统的建设重点在于突发情况的应对&#xff0c;国家已经把广…

更改el-cascade默认的value和label的键值

后端返回的树结构中&#xff0c;label的key不是el-cascade默认的label&#xff0c;我需要改成对应的字段&#xff0c;但是一直没有成功&#xff0c;我也在文档中找到了说明&#xff0c;但是我没注意这是在props中改&#xff0c;导致一直不成功 这是我一开始错误的写法&#xf…

vue快速入门(十二)v-key索引标志

注释很详细&#xff0c;直接上代码 上一篇 新增内容 v-key的使用场景数组筛选器的使用 源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

03-JAVA设计模式-适配器模式

适配器模式 设么是适配器模式 它属于结构型模式&#xff0c;主要用于将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使得原本由于接口不兼容而无法协同工作的类能够一起工作。 适配器模式主要解决的是不兼容接口的问题。在软件开发中&#xff0c;经常会有这…

C#操作MySQL从入门到精通(6)——对查询数据进行排序

前言 在和MySql数据库交互的过程中,查询数据是使用最频繁的操作,并且我们经常需要对查询到的数据进行排序后输出,比如我想查询1列数据的最小值,那么我可以将查询到的数据进行升序(从小到大)排列,然后取第一个数据就是最小值。本文详细介绍了对查询数据进行排序的各种操…

第一届长城杯初赛部分wp(个人解题思路)

目录 Black web babyrsa2 APISIX-FLOW cloacked 本人不是很擅长ctf&#xff0c;这只是我自己做出的西部赛区部分题的思路&#xff0c;仅供参考 Black web 访问http://192.168.16.45:8000/uploads/1711779736.php 蚁剑连接 访问/var/www/html/u_c4nt_f1nd_flag.php babyr…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

Win11 使用 WSL2 安装 linux 子系统 ubuntu,删除 linux 子系统 ubuntu

Win11 使用 WSL2 安装 linux 子系统 ubuntu&#xff0c;删除 linux 子系统 ubuntu 1、用 部署映像服务和管理工具 dism.exe 命令&#xff0c;开启 WSL2 按【WIN R】&#xff0c;打开【运行】&#xff0c;输入&#xff1a;【cmd】&#xff0c;管理员打开【命令行提示符】。 …

Vue项目打包配置生产环境去掉console.log语句的方法

一、Vue2项目 使用webpack内置的 terser 工具&#xff0c;在vue.config.js文件加上相应的配置即可。 二、Vue3项目 同样是使用 terser 工具&#xff0c;不过vite没有内置terser&#xff0c;需要手动安装依赖 安装完后在vite.config.js文件加上相应的配置即可。 2024-4-9