C++编译和链接

目录

一、源代码的组织

①头文件(*.h)

②源文件(*.cpp)

③主程序(main函数所在的程序)

④从源代码到可执行文件,编译的过程有三大步骤:

1)编译预处理

2)编译

3)链接

二、编译预处理

三、编译

四、链接

五、更多细节


一、源代码的组织

①头文件(*.h)

#include头文件、函数的声明、结构体的声明、类的声明、模板的声明、内联函数、#define和const定义的常量等。

②源文件(*.cpp)

函数的定义、类的定义、模板具体化的定义

③主程序(main函数所在的程序)

主程序负责实现框架和核心流程,把需要用到的头文件用#include包含进来。

④从源代码到可执行文件,编译的过程有三大步骤:

1)编译预处理

2)编译

3)链接

二、编译预处理

编译预处理是指对我们写的源代码进行预处理,生成临时文件

预处理的包括以下方面(了解即可)

①预处理#include头文件包含指令

②处理条件编译指令#iifdef #else #endif、#ifndef #else #endif

③处理#define宏定义

④为代码添加行号、文件名和函数名

⑤删除注释

⑥保留#pragma编译器指令(编译的时候会用到)

三、编译

编译主要是将预处理生成的临时文件经过词法分析、语法分析、语义分析以及优化和汇编后生成二进制的目标obj文件只检查是否合法,不检查定义是否存在,所以如果名称存在但是定义不存在,在编译的时候不会报错,链接的时候才会报错。

四、链接

链接是指将编译后的目标obj文件,以及他们需要的库文件链接在一起,形成一个整体的可执行的exe文件

五、更多细节

①分开编译的好处

每次只编译修改过的源文件,然后再链接,效率最高。

②编译单个*.cpp文件的时候,必须要让编译器知道名称的存在,否则会出现找不到标识符的错误。

③编译单个*。cpp文件的时候,编译器只需要知道名称的存在,不会把他们的定义一起编译。

④如果函数和类的定义不存在,编译不会报错,但链接会出现无法解析的外部命令。

⑤链接的时候,变量、函数和类的定义只能有一个,否则会出现重定义的错误。(如果把变量、函数和类的定义放在*.h文件中,*.h会被多次包含,链接前会存在多个副本,如果放在*.cpp文件中,*.cpp文件不会被包含,只会被编译一次,链接前只存在一个版本)

⑥把变量、函数和类的定义放在*.h中是不规范的做法,如果*.h会被多个*.cpp包含,会出现重定义。

⑦用#include包含*.cpp也是不规范的做法,原理同上。

⑧尽可能不适用全局变量,如果一定要用,要在*.h文件中声明(需要加extern关键字),在*.cpp中定义。

⑨全局的const常量在头文件中定义(const常量仅在单个文件内有效)。

⑩*.h文件重复包含的处理方法只对单个的*.cpp文件有效,不是整个项目。

11)函数模板和类模板的声明和定义可以分开书写,但它们的定义并不是真实的定义,只能放在*.h文件中;函数模板和类模板的具体化版本的代码时真实的定义,所以放在*.cpp文件中。

12.Linux下C++编译和链接的原理与VS一样。

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

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

相关文章

Matlab - Plot in plot(图中画图)

Matlab - Plot in plot(图中画图) 这是在MATLAB中创建一个嵌入式图形的示例,可以在另一个图形中显示。 与MATLAB中的“axes”函数相关。 Coding % Create data t linspace(0,2*pi); t(1) eps; y sin(t);% Place axes at (0.1,0.1) with w…

Winform窗体利用WebApi接口实现ModbusTCP数据服务

在上位机开发过程中,有时候会遇到需要提供数据接口给MES或者其他系统,今天跟大家分享一下,如何在Winform等桌面应用程序中,开发WebApi接口,提供对外modbus设备的数据服务。通讯模型是: 为了更好地演示应用场…

Qt- QSS样式表用法及用例说明

这里写自定义目录标题 QSS样式表用法1.Qt样式表语法2.选择器3.属性列表4.冲突解决5.全局添加QSS QSS样式表用法 整理qss样式表语法知识,方便今后查看。 1.Qt样式表语法 Qt样式表支持各种属性、伪状态和子控件,可以自定义小部件的外观 selector { attr…

Day01 关系型数据MySQL简介与多平台安装配置

文章目录 第一章 数据库简介1.1 数据库的简介1.2 数据库的分类 第二章 数据库的安装与配置2.1 安装: Windows版2.2 卸载: Windows版2.3 安装: Mac直装版2.4 卸载: Mac直装版2.5 安装: Mac Homebrew版2.6 卸载: Mac Homebrew版2.7 启动、停止mysql服务2.8 登录到MySQL2.9 修改密…

【dcdc】AP2813 DCDC降压恒流芯片 两路输出 一路恒流 一路瀑闪 电动摩托汽车灯方案

1,方案来源:深圳市世微半导体有限公司 汤巧 2,产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外围简单、内置功率管,适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功率管输出最大功率可达12W,最大电流…

从零开始学习JVM(五)-运行时数据区的方法区

1. 方法区基本介绍 官方文档:The Java Virtual Machine Specification 《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”但对于HotSpotJVM而言&…

webpack将vue3单页面应用改造成多页面应用

上篇文章搞了个单页面vue,现在要将其改成多页面,只是简单尝试,给了例子 其实也就是改个webpack的入口和html模版的配置,其他的话,每个页面都有自己的vue和路由实例,pinia的话就共享吧 !import…

Java版本电子招标采购系统源代码—企业战略布局下的采购寻源

智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明,可…

# 性能诊断 JProfiler 工具使用

性能诊断 JProfiler 工具使用 JProfiler是一个重量级的JVM监控工具,提供对JVM精确监控,其中堆遍历、CPU剖析、线程剖析看成定位当前系统瓶颈的得力工具。可以统计压测过程中JVM的监控数据,定位性能问题。 官网地址:Java Profiler…

shallowRef和shallowReactive的使用?

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、 shallowRef?二、 shallowReactive?在什么时候使用? 三、案例1、shallowRef2、shallowReactive 提示:以下是本篇…

App Store上线APP流程

现在App Store上已经有数百万款应用,因此对于App的规范要求也越来越高,对于新上线的APP需要满足这些规则并不是件容易的事。今天和大家分享这方面的知识,希望大家喜欢。北京木奇移动技术有限公司,专业的软件外包开发公司&#xff…

浙大数据结构第六周之初识图

题目详情:06-图1 列出连通集 给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。 输入格式: 输入第1…

飞书接入ChatGPT - 将ChatGPT集成到飞书机器人,直接拉满效率

文章目录 前言环境列表视频教程1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 转载自远控源码文章:飞书接入ChatGPT - 将ChatGPT集…

服务(第二十八篇)rsync

配置rsync源服务器: #建立/etc/rsyncd.conf 配置文件 vim /etc/rsyncd.conf #添加以下配置项 uid root gid root use chroot yes #禁锢在源目录 address 192.168.80.10 …

庄懂的TA笔记(十四十六)<特效:火焰 + 水流>

庄懂的TA笔记(十四&十六)<特效:火焰 水流> 目录 一、作业展示: 二、示范:火: 参考资料: 实现思路: 实践操作: 三、示范:水: 实现思路&am…

PCB 布线技术~PCB结构:Traces,电源平面

PCB导体:Traces • 铜是PCB中最常用的导体 – 走线或连接器一般通过镀金来提供一个抗腐蚀的电传导特性 – 走线的宽度和长度-由PCB布线工程师控制 • 在通常的制造工艺下,走线的宽度和之间的间距一般要≥5 mil – 走线厚度-制造工艺的变量 • 典型值 0.5oz – 3oz •…

C++(2):变量和基本类型

基本内置类型 C定义了一套包括算术类型(arithmetic type)和空类型(void)在内的基本数据类型。其中算术类型包含了字符、整型数、布尔值和浮点数。空类型不对应具体的值。 算数类型 算数类型分为两类:整型&#xff0…

【Linux】多种环境变量介绍与设置

文章目录 一. linux环境变量介绍1. linux中的环境变量配置文件2. 环境变量加载顺序 二. 操作环境变量1. 读取环境变量envexportecho $PATH 2. 设置环境变量2.1. export PATH:临时的环境变量2.2. 用户的环境变量vim ~/.bashrcvim ~/.bash_profile 2.3. 所有用户的环境…

网络原理(四):传输层协议 TCP/UDP

目录 应用层 传输层 udp 协议 端口号 报文长度(udp 长度) 校验和 TCP 协议 确认应答 超时重传 链接管理 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 总结 我们第一章让我们对网络有了一个初步认识,第二章和第三章我们通…

SpringBoot 整合 ChatGPT API 项目实战

SpringBoot 整合 ChatGPT API 项目实战 一、准备工作 二、补全接口示例 三、申请API-KEY 四、JavaScript调用API 五、SpringBoot使用ChatGPT API 体验到了ChatGPT的强大之后,那么我们会想,如果我们想基于ChatGPT开发一个自己的聊天机器人&#xff0…