c++编译过程初识
编译过程
预处理:主要是执行一些预处理指令,主要是#开头的代码,如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码,具体包括查找头文件、进行宏替换、根据条件编译等操作。
g++ -E example.cpp -o example.i
编译:进行词法分析、语法分析、语义分析、代码优化等,将.i文件转换为汇编代码文件,即.s文件。
g++ -S example.i -o example.s
汇编:这一阶段不同平台(Windows、Linux)的汇编器将汇编代码翻译为二进制的机器码,可被计算机识别并执行。windows上是.obj文件,linux上是.o文件。
g++ -c example.s -o example.o
链接:将.o或.obj文件和所需的库文件组合生成最终的可执行文件。
静态链接:程序编译时,将所需的库文件直接嵌入到最终的可执行文件中,使程序在运行时不再依赖外部库文件,启动速度快,但占内存,且库文件更新需重新编译。
动态链接:程序运行时,将程序所需的库文件加载到内存中,供程序调用。节省磁盘空间,且只需要更新库文件,但外部依赖可能导致较多的环境问题。
一个C++程序可以同时包含动态链接和静态链接的部分。
g++ example.o -o exec # 或者exec.exe文件
静态链接库
windows上.lib文件,linux上.a文件。
// test.h
#include<iostream>
using namespace std;int cacl(int a, int b);// test.cpp
#include "test.h"int cacl(int a, int b){cout << "这是库文件内容" << endl;return a>b?a:b;
}// main.cpp
#include "test.h"int main(){int a = cacl(4, 5);cout << "这是main函数内容" << " 最大值是" << a << endl;
}
静态库生成:1、g++ -c test.cpp test.o // 生成.o文件2、ar rsc libxxx.a *.o // ar打包工具,rsc打包参数,生成.a文件3、将.a文件和头文件发给客户使用即可
静态库使用1、.a文件、头文件、测试程序(main.cpp)放一起2、g++ main.cpp -o main -L./ -lxxx // main是生成的可执行程序。 -L指定库文件路径, -l指定库文件名称(掐头去尾中间的名称)
动态链接库
windows上.dll文件, linux上.so文件。windows上用不同编译工具生成的动态库文件会有不同。动态库有执行权限,静态库没有执行权限;
在C++中加载动态链接库主要有两种方式:隐式加载(静态加载)和显式加载(动态加载)。上述main函数中的直接使用的方式就属于静态加载。动态加载需要用到LoadLibrary函数。
test.h test.cpp main.cpp内容同上,生成动态链接库是直接使用gcc命令并且添加-fPIC(-fpic)以及-shared参数,具体如下:
动态库生成g++ -c -fpic test.cpp -o test.o // -fpic生成对位置没有要求的.o文件g++ -shared test.o -o libcacl.so // -shared生成动态库发布动态库和头文件:提供 xxx.h和 xxx.so
动态库使用g++ main.cpp -L ./ -l cacl -o app //编译测试程序
当生成可执行程序后,通过./app执行,会报错:./app: error while loading shared libraries: libcacl.so: cannot open shared object file: No such file or directory,这是因为找不到共享库文件,还需进行以下设置:
方案1、修改LD_LIBRARY_PATH环境变量,将动态库地址添加到变量里
vi ~/.bashrc,然后source生效
方案2、修改/etc/ld.so.conf文件
sudo /etc/ld.so.conf --添加动态库路径到此文件中
sudo ldconfig --更新/etc/ld.so.conf中的数据到/etc/ld.so.cache中
方案3、拷贝或创建软链接到/lib或/urs/lib目录
库拷贝
sudo cp libcalc.so /usr/lib
创建软链接(推荐这种方式)
sudo ln -s libcalc.so /usr/lib/libcalc.so
方案4、可执行文件内部的DT_RPATH段 --无法操作这种方案通过以上几种方案后,无论我们把app移动到任何目录下,都可以./app执行啦~~
启动可执行程序前,可以通过一个命令检测程序能不能找到需要的动态库,这个命令是ldd
例如: ldd app,如果没有找到就会显示not found
makefile初识
以上编译时都需要执行g++命令,如果项目比较大的话,这种方式是比较麻烦的,这时候就需要makefile文件了,它是定义一系列的编译规则的文件,一旦定义好,只需要执行一个make命令,整个工程完全自动编译。
一个最简单的示例:
/*target: dependenciescommand1command2...
*/test:g++ test.cpp main.cpp -o test.PHONY:clean
clean:rm test
test就是目标文件,执行make命令时会执行“g++ test.cpp main.cpp -o test“;
.PHONY是伪目标,为了防止有clean的同名文件。clean就是伪目标,执行make clean时会执行“rm test”的命令。
下面看一个优化后的makefile文件:
# 自定义变量
target = test
src = $(wildcard *.cpp) # wildcard函数,查找所有的cpp文件$(target):$(CXX) $(src) -o $@ # CXX是预定义变量,$@是自动变量.PHONY:clean
clean:-rm test
makefile提供了预定义变量、自动变量,还支持自定义变量,附上两张图片,忘了之前在哪看到的了,如有侵权删。需要注意,自动变量只能在command中使用。
除了wildcard函数外,还有patsubst函数:(这两个函数比较常用)
patsubst : $(patsubst %.cpp, %.o $(src))
// 将src中的.cpp后缀文件改为.o后缀,这个只是makefile里的替换,并不会真的改磁盘里的文件。
// .o文件是汇编后的文件,是编译时的依赖,只是上面我们没有指定依赖,所以没用到
make执行时,会进行时间戳比较,目标文件和依赖的时间戳比较,若是目标文件比依赖靠后,那make执行会提示“已是最新”。
CMakeLists初识
CMakeLists.txt文件用来描述项目的结构和依赖关系,然后生成适合不同构建系统的项目文件,如Makefile、Visual Studio项目文件、Xcode项目文件等。所以,如果我们不想写makefile文件,就可通过CMakeLists文件来生成。
.
├── build
├── CMakeLists.txt
├── include
│ └── test.h
├── main.cpp
└── src
└── test.cpp
下面我们通过编写CMakeLists文件,来编译代码
# cmake最低版本号
cmake_minimum_required(VERSION 3.0)
# 设置项目名称
project(cacl)# 添加头文件路径
include_directories(./include)
# 添加可执行目标
add_executable(main main.cpp)# 生成库文件
add_library(test SHARED src/test.cpp)
# 添加动态链接库
target_link_libraries(main test)
然后cd build目录,执行cmake ..,就会生成makefile文件,然后再执行make命令,就能得到可执行程序。以上编译过程实现了将test.cpp内容编译为so共享库,然后链接到main执行程序。
qmake初识
qmake是Qt官方提供的构建工具,专门用于构建Qt项目。它使用.pro文件来描述项目的结构和依赖关系,然后生成Makefile文件。
小节
以上知识点都比较浅显,目前我也是在学习c++的路上,希望与大家共勉~
参考链接
由浅入深,教你使用Makefile编译C++文件_c++ makefile-CSDN博客
c++ CMakeLists.txt详解_cmake --install build --strip-CSDN博客
相关文章:
c++编译过程初识
编译过程 预处理:主要是执行一些预处理指令,主要是#开头的代码,如#include 的头文件、#define 定义的宏常量、#ifdef #ifndef #endif等条件编译的代码,具体包括查找头文件、进行宏替换、根据条件编译等操作。 g -E example.cpp -…...
Java旅程(五)Spring 框架与微服务架构 了解 JVM 内部原理和调优
在现代企业级应用中,Spring 框架和微服务架构已经成为主流技术,而 Java 虚拟机(JVM)的理解和调优对于保证应用的高性能和稳定性也至关重要。本篇博客将深入讲解 Spring 框架与微服务架构,并进一步探讨 JVM 内部原理和调…...
SWAT-MODFLOW地表水-地下水耦合模型建模;QSWATMOD实现SWAT-MODFLOW联合
SWAT-MODFLOW地表水-地下水耦合建模的应用重要性: 1.全面性:耦合模型能够同时考虑地表水和地下水的相互作用,提供了一个更全面的水文循环模拟框架。2.准确性:通过耦合地表水和地下水模型,可以提高水文模拟的准确性&…...
Azure Function 解决跨域问题
这边前端call本地部署的azure function出现了跨域问题,搜索一下解决方案 直接修改local.setting.json,在其中添加CORS配置为通配符”*”,就行了 local.settings.json {"IsEncrypted": false,"Values": {"PYTHON_E…...
金融租赁系统的创新发展与市场竞争力提升探讨
内容概要 随着经济的快速发展,金融租赁系统逐渐成为金融市场中不可或缺的一环。它不仅提供了灵活的资金解决方案,还促进了企业的资本结构优化与资源配置效率。因此,了解该系统的市场背景与发展现状至关重要。 在现今环境下,新兴…...
Rust: offset祼指针操作
offset是偏移元素个数,不是字节数! fn main(){let student_a Student{id:20240001,name:"张三娃".into(),class_id:3,age:14,grade:1};let student_b Student{id:20240002,name:"李四牛".into(),class_id:3,age:15,grade:1};let …...
【C#】WPF设置Separator为垂直方向
1. 方法1 <Separator BorderBrush"Gray"><Separator.LayoutTransform><RotateTransform Angle"90" /></Separator.LayoutTransform> </Separator>2. 方法2 <Separator Style"{StaticResource {x:Static ToolBar.S…...
常见的限流算法
常见的限流算法 限流的定义固定窗口算法滑动窗口算法漏桶算法(推荐)令牌桶算法(推荐)限流粒度本地限流(单机限流)分布式限流(多机限流)分布式限流的实现 限流的定义 限流,也称流量控制。是指系统…...
图文教程:使用PowerDesigner导出数据库表结构为Word/Html文档
1、第一种情况-无数据库表,但有数据模型 1.1 使用PowerDesigner已完成数据建模 您已经使用PowerDesigner完成数据库建模,如下图: 1.2 Report配置和导出 1、点击:Report->Reports,如下图: 2、点击&…...
7-7 旅行售货员
目录 题目描述 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 详细代码: 题目描述 某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路…...
QT写的动态正弦曲线图显示并打印
创建一个显示正弦曲线的 QChartView,并通过定时器不断更新图表数据,模拟动态数据。此外,还包含了一个在特定时间自动将图表导出为 PDF 文件的功能。 代码分析和注释 #include <QApplication> #include <QMainWindow> #include &…...
AI开发:决策树模型概述与实现:从训练到评估和可视化 - Python
通过前面的一些练习,我们已经学习了支持向量机、 回归、 鸢尾花模型 、卷积、 知识图谱、 生成式对抗网络、 K近邻、 等AI算法的基本概念,熟悉了一些常用的AI库,并且使用PYTHON大法进行了一些实战练习。接下来,我们向更深一层的概…...
MySQL 性能瓶颈,为什么 MySQL 表的数据量不能太大?
MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的?性能分析 为什么 MySQL 表不能太大网上大部分人的说法:问题的关键: B树层数对查询性能的影响到底有多大? 是什么导致的 MySQL 查询缓慢?如何解决: MySQL的性能瓶颈(为什么MySQL有几万的qps,怎么来的? 一个全表扫描的查询…...
Vue中接入萤石等直播视频(更新中ing)
一、萤石: 1. 萤石云开发文档: https://open.ys7.com/help/31 2、安装: npm install ezuikit-js --save 3、在文件中引用:import EZUIKit from ezuikit-js 4、具体代码: 获取accessToken:https://open.…...
25 go语言(golang) - 内存分配机制原理
Go 语言的内存分配机制是一个复杂且高效的系统,旨在为程序提供快速和安全的内存管理。理解 Go 的内存分配有助于编写更高效的代码,并优化程序性能。 一、内存区域 栈(Stack) 栈用于函数调用时的临时变量分配。栈上的内存在函数返…...
【Linux命令】ps -a 和 ps -ef 的区别
ps -a 和 ps -ef 是 ps(process status)命令的不同选项,它们用于显示不同的进程信息。以下是这两个选项的主要区别: ps -a -a 选项表示显示所有拥有终端的进程,但不包括守护进程(daemon processes&#x…...
几个支持用户名密码的代理链工具: glider, gost, proxychains+microsocks
几个支持用户名密码的代理链工具: glider, gost, proxychainsmicrosocks gost -L:7777 -Fsocks5://192.168.2.20:7575 -Fsocks5://user:passwd1.1.1.1:10086 -Dgost:(https://github.com/ginuerzh/gost) 参考 https://www.quakemachinex.com/blog/279.html...
编译安装教程
编译教程 下面是一个完整的从源码编译安装软件的教程,涵盖了从环境准备到配置、编译、安装的所有可能会用到的步骤和细节,适用于各种类型的软件包。 一、环境准备 在开始编译源码之前,确保系统满足以下条件: 1. 安装必要工具 …...
计算机网络-物理层
1.1传输媒体: 导引型传输媒体:双绞线,同轴电缆,光纤 非导引型传输媒体:微波通信(2~40GHz) 1.2传输方式: 串行传输:一个接一个的依次传输 并行传输:一次发送n…...
缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布
近期,JuiceFS 企业版推出了 Cache Group Operator,用于自动化创建和管理缓存组集群。Operator 是一种简化 Kubernetes 应用管理的工具,它能够自动化应用程序的生命周期管理任务,使部署、扩展和运维更加高效。 在推出 Operator 之前…...
Linux应用软件编程-多任务处理(线程)
线程:轻量级的进程,线程的栈区独立(8M),与同一进程中的其他线程共用进程的堆区,数据区,文本区。 进程是操作系统资源分配的最小单位;线程是cpu任务调度的最小单位。 1. 线程的创建…...
MySql索引(基础篇)
后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 感谢各位大佬写的文章让我学到很多东西!只是在各位大佬的基础加了我自己的思路&a…...
手机发烫怎么解决?
在当今这个智能手机不离手的时代,手机发烫成了不少人头疼的问题。手机发烫不仅影响使用手感,长期过热还可能损害手机硬件、缩短电池寿命,甚至引发安全隐患。不过别担心,下面这些方法能帮你有效给手机 “降温”。 一、使用习惯方面…...
Java实现观察者模式
一、前言 观察者模式,又称为发布订阅模式,是一种行为设置模式,允许对象之间建立一对多的依赖关系,这样当一个对象状态改变时,它的所有依赖者(观察者)都会收到通知并自动更新。 二、具体实现 …...
OpenResty开发环境搭建
简介 OpenResty 是一个基于 Nginx的高性能 Web 平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。官方地址:http://openresty.org/cn/ 具备下列特点: 具备Nginx的完整功能基于Lua语言进行扩展&#…...
鸿蒙系统文件管理基础服务的设计背景和设计目标
有一定经验的开发者通常对文件管理相关的api应用或者底层逻辑都比较熟悉,但是关于文件管理服务的设计背景和设计目标可能了解得不那么清楚,本文旨在分享文件管理服务的设计背景及目标,方便广大开发者更好地理解鸿蒙系统文件管理服务。 1 鸿蒙…...
Elasticsearch-脚本查询
脚本查询 概念 Scripting是Elasticsearch支持的一种专门用于复杂场景下支持自定义编程的强大的脚本功能,ES支持多种脚本语言,如painless,其语法类似于Java,也有注释、关键字、类型、变量、函数等,其就要相对于其他脚本高出几倍的性…...
【蓝桥杯——物联网设计与开发】拓展模块4 - 脉冲模块
目录 一、脉冲模块 (1)资源介绍 🔅原理图 🔅采集原理 (2)STM32CubeMX 软件配置 (3)代码编写 (4)实验现象 二、脉冲模块接口函数封装 三、踩坑日记 &a…...
devops和ICCID简介
Devops DevOps(Development 和 Operations 的组合)是一种软件开发和 IT 运维的哲学,旨在促进开发、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它强调自动化流程,持续集成(CI…...
uniapp使用live-pusher实现模拟人脸识别效果
需求: 1、前端实现模拟用户人脸识别,识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口,验证前端传递的人脸是否存在,把认证结果反馈给前端。 3、前端根据服务端返回的状态,显示在…...
OSI 网络 7 层模型
问: 请你介绍一下OSI七层网络模型物理层解决什么问题?功能原理问题 数据链路层解决什么问题功能原理 网络层解决的问题功能原理 传输层解决什么问题功能原理会话层解决什么问题功能原理: 表示层解决什么问题 应用层解决什么问题如何展示? 问: 请你介绍一下OSI七层网络模型 物…...
RK356x bsp 7 - PCF8563 RTC调试记录
文章目录 1、环境介绍2、目标3、PCF85634、dts配置5、内核配置6、测试验证 1、环境介绍 硬件:飞凌ok3568-c开发板 软件:原厂rk356x sdk 2、目标 开发板断电后仍正常计时。 3、PCF8563 PCF8563 是由 NXP Semiconductors 公司生产的低功耗 CMOS 实时…...
Vue.js组件开发-如何实现vueFLow流程
在Vue.js组件中实现vueFlow流程实例 确保已经安装了vueFlow库。如果还没有安装,可以使用npm或yarn进行安装: npm install braks/vue-flow # 或者 yarn add braks/vue-flow步骤: 引入vueFlow组件: 在Vue组件文件中ÿ…...
upload-labs关卡记录15
图片马,这里就可以看到任务和注意事项: 使用一个正常图片,然后拼接一个一句话木马即可实现。这里就用命令窗口进行实现: copy 111.png/b shell.php/a shell.png 注意这里的命令窗口要在存在图片和一句话木马的目录下打开&#…...
面试题总结
一、mysql中的乐观锁、悲观锁、共享锁、排它锁、行锁、表锁 1、乐观锁 通过sql实现的,更新sql语句时加上where version #{version}乐观锁不是数据库自带的锁,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认…...
Linux | 零基础Ubuntu解压RaR等压缩包文件
目录 介绍 案例分析 安装工具 解压实践 介绍 RAR是一种专利文件格式,用于数据压缩与归档打包,开发者为尤金罗谢尔(俄语:Евгений Лазаревич Рошал,拉丁转写:Yevgeny Lazarevich R…...
自动化测试-Pytest测试
目录 pytest简介 基本测试实例 编写测试文件 执行测试 pytest运行时参数 mark标记 Fixture pytest插件 Allure测试报告 测试步骤 pytest简介 Pytest是一个非常流行的Python测试框架,它支持简单的单元测试和复杂的功能测试,具有易于上手、功…...
磁盘调度算法
先来先服务(FCFS)算法 原理: 按照进程请求访问磁盘的先后顺序进行调度。就像是排队买东西,先到的先服务。 示例(Python): def fcfs(requests):"""requests是一个包含磁盘请求序…...
多视图 (Multi-view) 与多模态 (Multi-modal)
多视图 (Multi-view) 与多模态 (Multi-modal) 是两种不同的数据处理方式,它们在机器学习和数据分析中有着重要的应用。尽管这两者有一些相似之处,但它们关注的角度和处理方法有所不同。 多视图 (Multi-view) 定义:多视图指的是同一数据对象…...
CFA知识点梳理系列:CFA Level II, Reading 7 Economics of Regulation
这是CFA知识点梳理系列的第七篇文章,上一篇文章可以参考以下链接: CFA知识点梳理系列:CFA Level II, Reading 6 Economic Growth...
微信流量主挑战:三天25用户!功能未完善?(新纪元4)
🎉【小程序上线第三天!突破25用户大关!】🎉 嘿,大家好!今天是我们小程序上线的第三天,我们的用户量已经突破了25个!昨天还是16个,今天一觉醒来竟然有25个!这涨…...
1.微服务灰度发布落地实践(方案设计)
前言 微服务架构中的灰度发布(也称为金丝雀发布或渐进式发布)是一种在不影响现有用户的情况下,逐步将新版本的服务部署到生产环境的策略。通过灰度发布,你可以先将新版本的服务暴露给一小部分用户或特定的流量,观察其…...
Web3如何推动元宇宙的去中心化发展?
随着科技的不断进步,元宇宙的概念逐渐从科幻变成现实,它不仅是虚拟世界与现实世界的融合,更是数字交互和社会参与的新形态。在这个过程中,Web3作为下一代互联网的核心技术,正发挥着关键作用。特别是在去中心化的元宇宙…...
【NODE】01-fs和path常用知识点
前言 最近在使用express-generator知识进行搭建前后端通信,其中有些知识点涉及到nodejs的fs和path核心模块,因此另写一篇文章进行介绍和代码案例练习。 fs(文件系统)和 path 是 Node.js 的核心模块,用于文件操作和路径…...
矩阵线性方程组
矩阵可以是任何形状 当矩阵的行数等于列数,称之为方阵,那么它就有行列式 矩阵的公式 矩阵分块法 Matrix(母体) 克拉默法则 线性方程组 注意初等列变换不是一个同解变换 初等变换与秩 XAB 可以用初等列变换但是不推荐,还是使用初等行变换.用转置思想求解 ( X A ) T…...
Web API和Web Services的区分
前些年一提及自动化测试,大多是指UI界面层的自动化测试。近几年,随着分层自动化测试概念的兴起,以及自动化测试自身的发展与细分,自动化测试包含了更多的内容。 API(Application ProgrammingInterface,应用程序编程接…...
各种数据库类型介绍
在软件开发和数据处理领域,数据库扮演着至关重要的角色。它们用于存储、检索和管理大量数据,是信息系统不可或缺的基础。以下是几种常用的数据库类型及其简要介绍: 1.关系型数据库(Relational Databases) 关系型数据库…...
Hive练习题11-15
11、第11题 info 表 date result 2005-05-09 win 2005-05-09 lose 2005-05-09 lose 2005-05-09 lose 2005-05-10 win 2005-05-10 lose 2005-05-10 lose 如果要生成下列结果, 该如何写sql语句? win lose 2005-05-09 2 2 2005-05-10 1 2 答案: (1) …...
【微信小程序】4plus|搜索框-历史搜索 | 我的咖啡店-综合实训
升级版1-清空全部的再次确认 实现功能: 历史搜索记录展示-历史搜索记录展示10条点击跳转-点击历史搜索记录可同步到搜索框并自动搜索全部删除-可一次性全部删除历史搜索记录全部删除-有再次确认操作展示 进行搜索后留下搜索记录 点击垃圾桶图标,显示【清空全部】 点击【清…...
学习笔记(C#基础书籍)-- C#高级应用
(12.25,12.26) I/O数据流技术:《第十二章》 为了能够长时间保存程序中的数据,I/O技术可以将数据保存到文件(如文本文件等)中。 ⭕文件基本操作 a.File类:支持对文件的基本操作&…...