
嵌入式/Linux C/C++软件工程师知识体系(包括面试)
文章平均质量分 80
面向Linux C/C++软件工程师,内容涵盖面试、笔试常见问题,以及实际工作问题,致力于打造Linux开发知识库
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
奇妙之二进制
csdn博客专家,C/C++领域优质创作者,抖音搜奇妙之二进制,专注于Linux C/C++、嵌入式Linux开发,偶尔谈谈人生,目前致力于完成大约500篇的linux C/C++开发知识体系库,所有的文章都会一直保持更新(优化内容、排版),想学习的可以订阅我的专栏,也可以关注Linux 世界。
展开
-
Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(1) C语言经典笔面试题(上)
C语言是嵌入式开发的常用语言,也是主要语言,很多企业在招聘嵌入式软件工程师时,C语言的熟练程度是一个重要考察点。笔试也是以C语言为主,所以想要拿到面试机会,还得通过C语言笔试,本专题总结了各大企业C语言笔面试常见的考题,并做了详细解答。文章目录1、sizeof在什么阶段执行?它是函数还是啥?2、指针的指针3、什么是大小端?写一个简单的程序判断系统的大小端。4、用变量a定义5、位操作6、符号转换7、typedef和define的区别8、C语言程序代码优化方法9、关键字static的作用10、const的使用原创 2020-08-16 13:17:29 · 33169 阅读 · 4 评论 -
Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(13) 请你描述下进程虚拟内存空间布局
对于这个问题,面试官可能拿出一张白纸,让你尝试画出linux下进程的虚拟内存空间布局,然后=再让你简述下每个分区的作用,可能会挑几个重点分区,例如堆区、栈区来进行深入展开,考察你对堆栈的理解等等。文章目录1 内核空间2 栈(stack)3 内存映射段(mmap)4 堆(heap)5 BSS段6 数据段(Data)7 代码段(text)8 保留区问题提问在多任务操作系统中,每个进程都运行在属于自己的内存沙盘中。这个沙盘就是虚拟地址空间(Virtual Address Space),在32位模式下它是一个4原创 2020-08-16 16:00:34 · 2235 阅读 · 2 评论 -
Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(11) linux下线程同步/互斥方式有哪些?
线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和信号量。面试基本不会考察接口使用,更侧重会实现原理。文章目录一、互斥锁二、条件变量(cond)三、信号量(sem)四、理解PV操作问题汇总一、互斥锁通过锁机制实现线程间的同步。初始化锁在Linux下,线程的互斥量数据类型是pthread_mutex_t。在使用前,要对它进行初始化。静态分配:pthread_mutex_t mutex = PTHREAD_M原创 2020-08-18 15:26:56 · 11739 阅读 · 3 评论 -
Linux C/C++ or 嵌入式面试之《C/C++笔面试系列》(10) C++ 前置后置增减运算符重载形式与比较
C语言的++、–运算符在此不讨论。文章目录1、前置后置增减运算符重载的形式2、前置和后置运算符的性能比较1、前置后置增减运算符重载的形式自增运算符“++”和自减运算符“–”分别包含两个版本。即运算符前置形式(如 ++x)和运算符后置形式(如 x++),这两者进行的操作是不一样的。因此,当我们在对这两个运算符进行重载时,就必须区分前置和后置形式。C++根据参数的个数来区分前置和后置形式。如果按照通常的方法来重载 ++ 运算符(即作为成员函数重载时不带参数,或者作为非成员函数重载时带有一个参数),那么重载原创 2020-09-01 19:13:14 · 5518 阅读 · 3 评论 -
Linux开发者的CI/CD(11)jenkins变量
pipeline {agent anystages {steps {script {steps {script {在script步骤内部,你可以像在普通 Groovy 脚本中一样定义和使用变量(如这些变量在各自的script块中是局部的,仅在该块内有效。原创 2024-11-25 23:09:48 · 507 阅读 · 0 评论 -
编译链接实战(23)交叉编译之./configure --build,--host,--target设置
host:编译出来的二进制程序所执行的主机,因为绝大多数是本机编译,本机执行,所以这个值就等于build。说明:我们利用mipsel-linux的编译器对binutils进行编译,编译出来的binutils运行在mipsel-linux,这个binutils用来编译能够在mipsel-linux运行的代码。说明:我们利用mipsel-linux的编译器对binutils进行编译,编译出来的binutils运行在i386-linux,这个binutils用来编译能够在mipsel-linux运行的代码。原创 2024-11-23 16:01:10 · 244 阅读 · 0 评论 -
C++编程法则365天一天一条(306) 条件变量(std::condition_variable)
cppref上对于条件变量如何正确、规范使用给出了详细说明,遗漏任何一点都会造成非正确使用条件变量而引入随机问题。是一种同步原语,通常与std::mutex一起使用,用于阻塞一个或多个线程,直到另一个线程修改共享变量(即条件)并通知。接口1的操作是先解锁,然后等待唤醒(即等待其他线程对同一个cv调用notify)。while (!主要用于解决意外唤醒的情况,首先条件不满足,调用wait睡眠等待,唤醒后,重新判断一次条件是否满足,不满足继续等待。原创 2020-12-10 19:07:53 · 597 阅读 · 0 评论 -
C++编程法则365天一天一条(303)异步编程之std::promise和std::future
头文件,用于实现异步操作中的值传递和异常传递。一起使用,提供了一种机制,使得一个线程可以将。是 C++11 引入的一个模板类,位于。调用后,再次尝试设置会导致。原创 2024-11-03 16:47:13 · 104 阅读 · 0 评论 -
C++编程法则365天一天一条(344)理解std::optional的设计初衷
的设计初衷是为了解决处理可选值时的安全性和清晰性问题,提供一种简洁、易用的方式来表示和管理可能不存在的值。通过引入,C++ 提供了一个更现代化的替代方案,减少了使用传统空指针和特定标记值所带来的复杂性和错误风险。原创 2024-11-02 14:41:43 · 157 阅读 · 0 评论 -
C++编程法则365天一天一条(12)再谈static_cast之不能使用的场景
可以用于在整数和浮点类型之间进行转换,但在某些情况下,可能导致数据丢失或精度问题。例如,将一个大浮点数转换为整数,可能会丢失精度。不能用于复杂的类型转换,如数组到指针的转换、函数指针的转换等。对于这些情况,应使用其他类型转换,如。不能用于将两个不相关的类型进行转换。是 C++ 中用于类型转换的一个关键字,它在许多情况下都非常有用,但也有一些场景是不能使用。对于需要从常量指针转换为非常量指针的情况,应使用。在使用多态时,如果不确定对象的真实类型,应该使用。,它会在运行时检查类型,并在转换失败时返回。原创 2024-11-02 13:42:00 · 92 阅读 · 0 评论 -
C++编程法则365天一天一条(6)转换构造函数
C++ 中的转换构造函数是一种特殊的构造函数,用于将其他类型的对象转换为目标类的对象。从形式上来看,转换构造函数是指未被explicit限制的构造函数。原创 2023-03-12 20:54:44 · 179 阅读 · 0 评论 -
Linux C/C++并发编程实战(9)x86 上的原子操作实现--lock 指令前缀
当指令执行完毕,这个锁定动作也就会消失。在单处理器系统( UniProcessor,简称 UP)中,能够在单条指令中完成的操作都可以认为是原子操作,因为中断只能发生在指令与指令之间。在多处理器系统( Symmetric Multi-Processor,简称 SMP)中情况有所不同,由于系统中有多个处理器在独立的运行,即使在能单条指令中完成的操作也可能受到干扰。(以及所有以 ‘X’ 开头的指令)都能够保证在多处理器系统下的原子操作,它们总会宣告一个 “LOCK#” 信号,而不管有没有 LOCK 前缀。原创 2024-09-22 21:58:31 · 388 阅读 · 0 评论 -
Linux C/C++ or 嵌入式面试之《多进程多线程编程系列》(22) 互斥锁实现原理
futex是fast userspace mutex的缩写,翻译过来就是快速用户空间互斥锁,是内核提供的同步机制,可以用于实现互斥锁、读写锁、条件变量等。锁本质上就是一个计算变量,或者说一块存放变量的内存。当置1时表示上锁,置0表示解锁。futex便是一个32位的整型变量,只不过这个变量的地址由用户指定,也就是futex调用的第一个参数,需要用户传入变量地址。为了在进程间共享 futex,它通常放在使用 mmap 或 shmat 创建的共享内存区域中。原创 2024-09-22 19:00:34 · 605 阅读 · 0 评论 -
网络编程实战(19)正向代理和反向代理
在计算机网络领域,代理服务器扮演着至关重要的角色,它在服务器与客户端之间充当中间人的角色,有效地提高系统的安全性、性能和可扩展性。其中正向代理和反向代理是两种最为常见的代理方式。本文将详细介绍这两种代理方式的概念、特点、使用场景以及用途,帮助读者更好地理解它们在网络架构中的作用。正向代理和反向代理在计算机网络中各自发挥着重要的作用。正向代理主要关注客户端的访问需求和安全性,而反向代理则更注重后端服务器的负载均衡、安全性和性能优化。原创 2024-08-28 11:26:26 · 244 阅读 · 0 评论 -
网络编程实战(17)一文读懂VPN以及OpenVPN实现原理
ISP(Internet Service Provider,互联网服务提供商)是提供互联网接入服务的公司或组织。ISP 通过各种技术(如光纤、DSL、卫星或无线)将互联网连接到家庭或企业。由于国内的一些原因,有时候我们访问Google、youtobe等国外网站,需要通过一些代理软件才能访问,俗称科学上网。原创 2024-08-23 09:01:13 · 407 阅读 · 0 评论 -
Linux C/C++并发编程实战(11)缓存颠簸
当一个处理器写入数据时,缓存一致性协议需要确保其他处理器的缓存中的数据也被更新或使其失效。例如,如果一个处理器在处理器 A 的缓存中更新了数据,那么协议会将这个更新传播到其他处理器的缓存。缓存一致性协议:为了保证在多个处理器缓存中数据的一致性,系统使用缓存一致性协议(如 MESI)。每当一个处理器写入数据时,协议必须将这个更新通知到所有其他处理器,以确保它们的缓存中的数据是一致的。每个处理器的缓存都可能有该数据的副本。当一个处理器对这个数据进行写入(如增加计数器的值)时,这个数据在处理器的缓存中被更新。原创 2024-08-15 18:19:01 · 291 阅读 · 0 评论 -
linux防火墙iptables用法
在早期的 Linux 系统中,默认使用的是iptables配置防火墙。尽管新型 的firewalld防火墙已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用 iptables。考虑到 iptables 在当前生产环境中还具有顽强的生命力,我觉得还是有必要再好好地讲解一下这项技术。iptables 是 Linux 防火墙工作在用户空间的管理工具,是IP 信息包过滤系统是一部分,用来设置、维护和检查 Linux 内核的 IP 数据包过滤规则。filterinputoutput和。原创 2024-08-12 17:23:18 · 184 阅读 · 0 评论 -
《网络编程实战系列》(17)网络桥接模式
桥接模式通过将多个网络接口连接在一起,形成一个逻辑上统一的网络,为网络设备之间的通信提供了一种简洁而有效的解决方案。它广泛应用于网络扩展、虚拟化环境、无线网络等场景中。尽管桥接模式具有透明性和兼容性,但在大型网络或复杂环境中,需要谨慎配置,以避免潜在的广播风暴和安全问题。原创 2024-08-10 23:10:12 · 331 阅读 · 0 评论 -
《网络编程实战系列》(15)NAT网络地址转换原理
举个例子,客户端172.18.250.6和百度服务器202.108.22.5通信,172.18.250.6发送数据时,先转换为219.155.6.240:1723(任意>1024的随机端口),然后再利用这个身份发送数据给百度服务器,然后百度服务器回应数据并发送给219.155.6.240:1723,NAT网关检查自己的关联表,意识到这是自己地私网中172.18.250.6的数据包,然后把这个数据发送给客户端。此种方式下,转换上层协议就是不必要的,因为一个公网IP就能唯一对应一个内部主机。原创 2024-08-10 17:41:19 · 145 阅读 · 0 评论 -
《网络编程实战系列》(16)route命令用法大全
命令是一个用于显示和操作 IP 路由表的工具。它可以在 Linux 和类 Unix 操作系统中使用,包括 OpenWrt。如果需要修改已有的路由条目,可以通过先删除原有条目,然后重新添加新的条目来实现。(img-vTawoqiA-1723106434344)]命令来查看当前系统的路由表信息,包括目标网络、网关、网络接口和路由类型等。命令可以向系统的路由表中添加新的路由条目。命令可以从路由表中删除指定的路由条目。网络的数据包发送到指定的网关进行路由。命令的详细使用说明和选项,可以使用。这样,系统就会将属于。原创 2024-08-08 15:10:12 · 323 阅读 · 0 评论 -
mqtt协议详解(0)初步认识mqtt
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种构建在TCP/IP协议之上的轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境。MQTT 协议于 1999 年发明,用于石油和天然气行业。工程师需要一种协议来实现最小带宽和最小电池损耗,以通过卫星监控石油管道。最初,该协议被称为消息队列遥测传输,得名于首先支持其初始阶段的 IBM 产品 MQ 系列。原创 2024-07-31 23:07:38 · 221 阅读 · 0 评论 -
安全与加密常识(2)TLS/SSL安全协议
传输层安全性协议 Transport Layer Security,TLS 及其前身安全套接层 Secure Sockets Layer,SSL是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器-网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。发展历程SSL 1.0和2.0: 1990年代初期由网景公司开发,但存在严重的安全漏洞,因此很快被废弃。原创 2024-07-30 22:52:37 · 185 阅读 · 0 评论 -
mqtt协议详解(7)三种qos介绍与实现原理
很多时候,使用 MQTT 协议的设备都运行在网络受限的环境下,而只依靠底层的 TCP 传输协议,并不能完全保证消息的可靠到达。因此,MQTT 提供了 QoS 机制,其核心是设计了多种消息交互机制来提供不同的服务质量,来满足用户在各种场景下对消息可靠性的要求。QoS 0,最多交付一次。QoS 1,至少交付一次。QoS 2,只交付一次。其中,使用 QoS 0 可能丢失消息,使用 QoS 1 可以保证收到消息,但消息可能重复,使用 QoS 2 可以保证消息既不丢失也不重复。原创 2024-07-26 23:30:03 · 289 阅读 · 0 评论 -
1000张linux C/C++工程师面试高质量图
本文持续更新…原创 2024-06-30 22:29:26 · 786 阅读 · 0 评论 -
安全与加密常识(3)什么是数字签名和数字证书
此时,苏珊实际拥有的是道格的公钥,但是还以为这是鲍勃的公钥。因此,道格就可以冒充鲍勃,用自己的私钥做成"数字签名",写信给苏珊,让苏珊用假的鲍勃公钥进行解密。她写完后用鲍勃的公钥加密,就可以达到保密的效果。尽管帕蒂和道格可能可以拿到苏珊加密后的信且拥有鲍勃的公钥,但是由于他们没有鲍勃的私钥,因此无法解密。这里要强调的是,只要鲍勃的私钥不泄露,这封信就是安全的,即使落在别人手里,也无法解密。苏珊收信后,用CA的公钥解开数字证书,就可以拿到鲍勃真实的公钥了,然后就能证明"数字签名"是否真的是鲍勃签的。原创 2024-06-30 01:05:06 · 870 阅读 · 0 评论 -
安全与加密常识(4)证书签名请求(CSR)
证书签名请求(Certificate Signing Request,简称CSR)是一个由申请证书的实体(如公司或个人)生成的文件,其中包含申请者的公钥和身份信息(如组织名称、通用名、地点等)。CSR主要用于在数字证书认证过程中向证书颁发机构(Certificate Authority,CA)请求签名,以便获取一个受信任的数字证书。CSR的主要组成部分:公钥CSR包含了申请者的公钥,此公钥将被包含在最终的证书中。主体信息这些信息包括申请者的姓名、组织、部门、城市、州/省和国家等。原创 2024-06-26 23:31:20 · 1978 阅读 · 0 评论 -
安全与加密常识(5)自签名证书
自签名证书是由不受信的CA机构颁发的数字证书,也就是自己签发的证书。与受信任的CA签发的传统数字证书不同,自签名证书是由一些公司或软件开发商创建、颁发和签名的。虽然自签名证书使用的是与X.509证书相同的加密密钥对架构,但是却缺少受信任第三方的验证。在颁发过程中缺乏独立验证会产生额外的风险,这就是为什么对于面向公众的网站和应用程序来说,自签名证书是不安全的。原创 2024-06-27 23:37:00 · 1574 阅读 · 0 评论 -
安全与加密常识(7)pem, der, crt, cer, key等各类证书与密钥文件后缀解析
在Windows平台上,CRT文件通常用于存储公钥证书,而CER文件则用于存储包含公钥和私钥的证书。CRT文件通常使用PEM或DER格式进行编码,而CER文件则通常使用DER格式进行编码。编码,并且包含了起始标记和结束标记,以便于识别和区分不同类型的密钥和证书,(例如-----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE-----)。使用PEM格式编码的KEY文件具有良好的可读性和可编辑性,而使用DER格式编码的KEY文件则更加紧凑和高效。原创 2024-06-30 20:18:29 · 1305 阅读 · 0 评论 -
安全和加密常识(6)Base64编码方式
Base64 是一种用于将二进制数据编码为仅包含64种ASCII字符的文本格式的编码方法,注意,它不是加密算法。它设计的目的主要是使二进制数据能够通过只支持文本的传输层(如电子邮件)进行传输。Base64常用于在需要处理文本数据的场合中存储和传输二进制数据。原创 2024-06-30 20:13:54 · 585 阅读 · 0 评论 -
安全和加密常识(1)对称加密和非对称加密以及相应算法
非对称加密使用一对密钥:公钥(public key)和私钥(private key)。公钥用于加密数据,私钥用于解密数据,因此公钥可以自由分发给任何人,而私钥则必须严格保密。对称加密使用同一个密钥(称为对称密钥)来加密和解密数据。加密和解密过程都使用这个密钥,因此在传输过程中需要确保密钥的安全性。对称加密算法的特点是加密和解密速度快,适合大量数据的加密。对称加密和非对称加密是信息安全领域中两种重要的加密方式,它们分别使用不同的加密算法和密钥管理方式来保护数据的机密性。原创 2024-06-30 13:22:25 · 561 阅读 · 0 评论 -
安全与加密常识(0)安全与加密概述
加密是信息安全的一个核心组成部分,数据加密是一种将数据从明文(未加密)转换为密文(加密)的方法。用户可以使用加密密钥访问加密数据,使用解密密钥访问解密数据。加密过程:数据 + 密钥 = 密文解密过程:密文 - 密钥 = 数据明文:明文指的是未被加密过的原始数据。密文:明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。原创 2024-06-29 18:07:42 · 518 阅读 · 0 评论 -
linux进程加载和启动过程分析
我们的源代码通过预处理,编译,汇编,链接后形成可执行文件,那么当我们在终端敲下指令后,操作系统是怎么将我们的可执行文件加载并运行的呢?首先知道,计算机的操作系统的启动程序是写死在硬件上的,每次计算机上电时,都将自动加载启动程序,之后的每一个程序,每一个应用,都是不断的 fork 出来的新进程。那么我们的可执行文件,以linux 系统为例,也是由shell 进程 fork 出一个新进程,在新进程中调用exec函数装载我们的可执行文件并执行。原创 2024-06-01 22:39:10 · 299 阅读 · 0 评论 -
shell从入门到精通(23)贪婪匹配、非贪婪以及独占模式
非贪婪匹配会尽可能少地匹配符合模式的字符,只匹配满足条件的最少字符数。例如,在正则表达式\d+中,加号表示匹配一个或多个数字,而贪婪匹配会尽可能多地匹配连续的数字,直到遇到非数字字符为止。通过使用问号来实现非贪婪匹配,我们可以得到我们需要的最小匹配结果。第一个示例中,使用贪婪匹配模式\d+匹配了字符串中的尽可能多的数字,并将结果打印出来。简而言之,贪婪匹配会尽可能多地匹配,而非贪婪匹配会尽可能少地匹配,根据具体的需求选择适当的匹配方式。在正则表达式中,贪婪匹配和非贪婪匹配是指匹配模式下的不同行为。原创 2024-05-26 23:48:28 · 187 阅读 · 0 评论 -
shell从入门到精通(22)shell正则匹配~=
如果匹配成功,BASH_REMATCH[0] 将会存储整个匹配的结果,而 BASH_REMATCH[1]、BASH_REMATCH[2] 和 BASH_REMATCH[3] 分别存储了正则表达式中括号捕获的三个子模式的匹配结果。BASH_REMATCH 数组的第一个元素 (即 BASH_REMATCH[0]) 存储着整个正则表达式匹配的部分,而后续的元素依次存储了正则表达式中使用括号捕获的子模式的匹配结果。捕获匹配结果: 通过使用括号创建子模式,可以捕获匹配到的子字符串,以便后续在脚本中使用。原创 2024-05-26 23:23:58 · 231 阅读 · 0 评论 -
C++编程法则365天一天一条(60)改革不彻底的产物:字符串视图string_view
是 C++17 引入的一个字符串视图类。它是一个轻量级、非拥有、只读的字符串查看器,可以用于以只读方式访问字符串的连续字符序列,而无需复制字符串数据。python里一切皆对象,包括字符串字面量,提供了一种类似于Python字符串对象的方式来处理字符串字面量,但改革得没有python彻底,毕竟还需要构造转换而非编译层面支持。下面是非拥有性不拥有字符串数据,它仅仅是对现有字符串的引用或视图。这意味着它不负责管理字符串的生命周期,需要确保字符串数据的生存期足够长,防止出现空悬指针的风险。只读性。原创 2024-05-19 12:01:38 · 93 阅读 · 0 评论 -
面向对象设计与分析(41)建造者模式builder
看下builder模式的官方定义:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。Builder 模式是一种创建型设计模式,旨在通过提供一种更加灵活的方式来构建复杂对象。它允许你分步骤构建对象,同时可以灵活地配置对象的属性和参数。这个模式通常包括以下几个角色:Director(指导者):负责组织构建过程的顺序,但不负责实际构建对象的细节。客户端通过指导者来构建最终的对象。Builder(构造者):定义了构建对象的抽象接口,包括构建对象的每个部分的方法。原创 2024-04-21 18:21:50 · 336 阅读 · 0 评论 -
CMake基础教程(30)在cmake里执行命令execute_process
子进程的标准输出是由COMMAND参数指定的命令在执行过程中生成的任何文本输出。如果您需要在构建时执行自定义命令,可以使用add_custom_target()和add_custom_command()命令来创建自定义命令,这些命令会在构建时运行。如果需要按顺序执行多个命令,则可以使用多个execute_process调用,每个调用只包含一个COMMAND参数,以实现顺序执行的效果。如果同时为这两个选项指定了相同的变量名,则子进程的标准输出和标准错误输出将被合并,并按照它们产生的顺序放入变量中。原创 2022-03-27 21:49:12 · 3591 阅读 · 0 评论 -
cmake基础教程(37)configure_file动态生成头文件
configure_file是一个在构建过程中用于生成配置文件的CMake命令。它允许开发人员将输入的模板文件与预定义的变量替换,并将结果输出到指定位置,从而生成最终的配置文件。cmake 中的 configure_file 指令将输入文件经过处理生成输出文件,处理的过程主要是变量替换。主要参数说明:input:输入的文件名,通常为xx-config.h.in,输入文件的位置相对于CMAKE_CURRENT_SOURCE_DIR。原创 2022-08-21 20:35:33 · 1278 阅读 · 0 评论 -
cmake基础教程(12)函数和宏用法
参考:https://cmake.org/cmake/help/latest/command/function.htmlhttps://cmake.org/cmake/help/latest/command/macro.html#command:macro在CMake中,函数和C或C++中的函数非常相似。你可以将参数传递给函数,它们在函数内部变成了变量。同样,一些标准变量如 ARGC、ARGV、ARGN,以及 ARGV0、ARGV1 等也被定义了。函数调用具有动态范围。在函数内部,你处于一个新的变量作用域;原创 2024-04-10 14:08:47 · 380 阅读 · 0 评论 -
编译链接实战(25)gcc ASAN、MSAN检测内存越界、泄露、使用未初始化内存等内存相关错误
fsanitize=address是一个编译器选项,用于启用AddressSanitizer(地址清理器),这是一种快速的内存错误检测工具。它可以检测出程序中的两种常见错误:越界访问(out-of-bounds accesses)和使用后释放(use-after-free)错误。当你在编译程序时使用这个选项,编译器会插入额外的代码来检查每次内存访问是否合法,以便发现潜在的内存错误。原创 2024-03-02 16:20:59 · 612 阅读 · 0 评论