C++源文件的编译过程 学习 CMake 文档的前置知识

OHHHH,发现自己的基础知识真他妈的是呼呼漏风,,,,,,,,,,,

尴尬得意识到,不仅是英语水平有问题,他码的基础知识也有问题。在预先学习某个内容之前,应该对这个内容和相关设计的专有名词基础概念有个初步的认识,然后再学习也许会快一些?

我现在在尝试这样做,先gpt了解基础的用法和解释和一些常见的单词与中文对上号(以后英语好了也许这一步就不用了他妈的,,,)

简单demo : 将一个源文件通过g++编译链接生成一个可执行文件:

(1)预编译阶段 :

该阶段没有指令

(2)编译源文件生成object file

g++ -c source_file.cpp -o object_file.o

`-c` 选项 :告知编译器仅将源文件编译生成object file 而不用链接该object file 为一个可执行文件

`-o` 选项 :告知编译器 生成的该 object file 名字是什么

(3)链接 object file 来生成一个可执行文件

链接阶段:链接器(linker)将目标文件与其他必要的目标文件和库结合起来,解析(resolve)外部引用,并生成可供操作系统运行的最终可执行文件。

g++ object_file.o -o executable_file

 `-o` 选项 :告知编译器 生成的可执行文件的名字是什么

(3)已经生成链可执行文件,美美执行即可

./executable_file

 

1. header file = include file   头文件

定义:An include file, often referred to as a header file, is a file containing declarations of functions, objects, or macros that are used in a program.

header file 中包括 函数,对象 或者 宏 的声明。将包括这些声明的头文件 用 #include 指令包括在source file 中,就相当于告知编译器将 header file 中的内容 插入到 source file 的对应使用`#include<> `的位置中

头文件的作用是:让你可以在源文件中自由使用这些头文件中声明的 函数、对象、宏 等。

2.  include directionary = include path 

用于告知编译器从那里可以寻找到include ifle 

一般来说:被 `<>` 符号包裹的头文件,例如 `<iostream>`一般是从系统的环境目录中搜索,搜索不到就从指定的路径中搜索(这个指定的目录被保存在 include directionary 中)

被 ` " " ` 符号包裹的头文件,例如 ` "math.h" `一般是从当前源文件所在的目录中搜索,搜索不到就从指定的路径中搜索(这个指定的目录被保存在 include directionary 中)

在 cmake 中,可以使用 target_include_directionarier()  或 include_directionaries() 两种函数来制定这个路径

2. macros : 宏

3. machine code :

机器代码 是指 可以由计算机CPU 直接执行的 指令的二进制表示形式。它由 0 和 1 组成,特定于 CPU 的架构。

机器代码中的 每条指令 对应于 CPU 可以执行的 特定操作。

在从源文件生成可执行文件的过程中,在编译阶段会生成 machine code 

4. executable code (executable file)&& machine code:  

executable code 中包括 machine code,也包括一些使操作系统能够有效运行程序的其他必要的信息,例如:头、节、元数据和数据结构等内容。这些附加信息能帮助操作系统了解如何正确加载和运行程序。

操作系统依赖可执行文件中的附加信息来正确设置程序的执行环境,管理内存分配,处理输入和输出操作,并执行其他基本任务以支持程序的执行。

4. object code

5. 关于 这三个文件之间仍有疑问,但我要换一课目了,,,脑子不转了,,,,

3. pre-compiled 预编译

4. 编译链接的过程:

编译(compilation)一般被分为三步骤:

预处理(preprocessing) : 预处理器将解析(resolve)源文件(source file)和头文件(header file)中的所有的预处理命令(preprocessor directive)。预处理命令包括 #define #include 等等

编译:将 预处理后的代码 转换为 汇编代码或直接转变为目标代码

6. include file 和 .lib 区别

c++ - include directories vs. lib directory concept question - Stack Overflow

3. 举一个编译 所谓 include file 的例子:

 我的文件和文件组织形式如下:

想要成功将main.cpp编译生成可执行文件,需要使用指令告知 g++ 编译 main.cpp 的时候需要链接上 math.cpp 中的内容(因为main.cpp 中使用了 math.cpp 中定义的函数)

 编译指令如下:

g++ -o myprogram main.cpp math.cpp

这里就会存在一个疑问:g++是咋找到 math.cpp这个地址的,在发现main.cpp 文件中没有 对add函数的定义,就可以只接找到对应的math.cpp么????

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

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

相关文章

Web实验总

目录 网站需求&#xff1a; 思路&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;准备工作 第二步&#xff1a;新建一个存储网页的目录 第三步&#xff1a;修改本地hosts映射 第四步&#xff1a;修改配置文件&#xff0c;建立基于http服务的网站 1)创建用户song和…

iOS移动应用安全加固:保护您的App免受恶意攻击的重要步骤

目录 iOS移动应用安全加固&#xff1a;保护您的App免受恶意攻击的重要步骤 摘要 引言 一、APP加固的概念 二、APP加固方案的比较 三、保护iOS应用的安全 四、总结 参考资料 摘要 本文介绍了移动应用程序&#xff08;App&#xff09;加固的概念和流程&#xff0c;以及市…

[模版总结] - 树的基本算法1 - 遍历

树结构定义 一种非线性存储结构&#xff0c;具有存储“一对多”关系的数据元素集合 种类 General Tree TrieB/B 树二叉树 满/完满/完全二叉树 完美BT : 除了叶子结点外所有节点都有两个字节点&#xff0c;每一层都完满填充完全BT&#xff1a; 除最后一层以外其他每一层都完美…

单元测试工具-Junit

文章目录 一. 认识Junit二. Junit中常用的注解1. Test2. Disabled3. BeforeAll & AfterAll4. BeforeEach & AfterEach 三. ParameterizedTest参数化1. 单参数2. 多参数2.1. CSV 获取参数2.2. 方法获取参数 四. Order控制测试用例的执行顺序五. 断言六. 测试套件1. 通过…

Docker进阶——再次认识docker的概念 Docker的结构 Docker镜像结构 镜像的构建方式

前言 在微服务大量应用的互联网时代&#xff0c;经常能看到docker的身影。作为docker的爱好者&#xff08;在服务器安装MySQL&#xff0c;Redis。。。我用的都是docker&#xff09;&#xff0c;我也会持续深入学习和认识docker。 本篇博客再次介绍docker的基本概念&#xff0…

SmartBear正式收购Stoplight,并计划在核心API设计、文档和门户产品中集成其功能

不久前&#xff0c;软件开发和可视化工具提供商SmartBear正式宣布收购全球领先的API设计公司Stoplight。这一收购是为了打造业内最全面的API开发平台&#xff0c;为寻求现代化API实践的开发团队提供更好的透明度、自动化与生产力。将Stoplight在API方面的优势&#xff08;包括治…

吴恩达《机器学习》7-1->7-4:过拟合问题、代价函数、线性回归的正则化、正则化的逻辑回归模型

一、过拟合的本质 过拟合是指模型在训练集上表现良好&#xff0c;但在新数据上的泛化能力较差。考虑到多项式回归的例子&#xff0c;我们可以通过几个模型的比较来理解过拟合的本质。 线性模型&#xff08;欠拟合&#xff09;&#xff1a; 第一个模型是一个线性模型&#xff0…

Elasticsearch:Lucene 中引入标量量化

作者&#xff1a;BENJAMIN TRENT 我们如何将标量量化引入 Lucene。 Lucene 中的自动字节量化 虽然 HNSW 是一种强大而灵活的存储和搜索向量的方法&#xff0c;但它确实需要大量内存才能快速运行。 例如&#xff0c;查询 768 维的 1MM float32 向量大约需要 1,000,000*4*(7681…

多维时序 | MATLAB实现TCN时间卷积神经网络多变量时间序列预测

多维时序 | MATLAB实现TCN时间卷积神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现TCN时间卷积神经网络多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现TCN时间卷积神经网络多变量时间序列预测 模型描述 MATLAB实现TCN时间卷…

3.前端调式(断点调式)

1. Elements 先来看这张图最上头的一行是一个功能菜单&#xff0c;每一个菜单都有它相应的功能和使用方法&#xff0c;依次从左往右来看 箭头按钮 用于在页面选择一个元素来审查和查看它的相关信息&#xff0c;当我们在Elements这个按钮页面下点击某个Dom元素时&#xff0c;箭…

ubuntu16.04安装vscode遇到的code 依赖于 libnss3 (>= 2:3.30)解决

1、ubuntu16.04安装最新版本vscode失败原因 ubuntu16.04安装最新版本的vscode会遇到依赖libnss3(>2:3.30)的问题&#xff0c;原因是ubuntu16.04安装的库libnss3版本更低&#xff0c;与vscode需要的更高版本的libnss3库不兼容&#xff0c;只需要升级libnss3库版本高于2:3.30…

PROFINET和UDP、MODBUS-RTU通信速度对比实验

这篇博客我们介绍PROFINET 和MODBUS-RTU通信实验时的数据刷新速度,以及这种速度不同对控制系统带来的挑战都有哪些,在介绍这篇对比实验之前大家可以参考下面的文章链接: S7-1200PLC和SMART PLC的PN智能从站通信 S7-200 SMART 和 S7-1200PLC进行PROFINET IO通信-CSDN博客文…

LeetCode(4)删除有序数组中的重复项 II【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 80. 删除有序数组中的重复项 II 1.题目 给你一个有序数组 nums &#xff0c;请你** 原地** 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数…

Ubuntu18.04.6安装qt5.7.1(超级详细教程)

目录 1、下载对应Linux版本的qt 2、安装完qt&#xff0c;可能也要安装下对应的编译工具 1、下载对应Linux版本的qt &#xff08;1&#xff09;准备安装的是qt5.7.1&#xff1a;qt-opensource-linux-x64-5.7.1.run &#xff08;2&#xff09;在虚拟机进入存放qt安装包的目录…

Linux安装MySQL8.0服务

Linux安装MySQL8.0服务 文章目录 Linux安装MySQL8.0服务一、卸载1.1 查看mariadb1.2 卸载 二、安装2.1 下载2.2 上传2.3 解压2.4 重命名2.5 删除2.6 创建目录2.7 环境变量2.8 修改配置2.9 配置文件2.9 用户与用户组2.10 初始化2.11 其它 三、开启远程连接MySQL 一、卸载 首先第…

springcloud图书借阅管理系统源码

开发说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;nodejs&#xff0c;idea&#xff0c;nodejs&#xff0c;vscode springcloud springboot mybatis vue elementui 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示搜索图书&#xff0c;轮播图&…

地区 IP 库

地区 & IP 库 yudao-spring-boot-starter-biz-ip (opens new window)业务组件&#xff0c;提供地区 & IP 库的封装。 #1. 地区 AreaUtils (opens new window)是地区工具类&#xff0c;可以查询中国的省、市、区县&#xff0c;也可以查询国外的国家。 它的数据来自 …

MySQL | 数据库的表的增删改查【进阶】

MySQL | 数据库的表的增删改查【进阶】 文章目录 MySQL | 数据库的表的增删改查【进阶】系列文章目录本节目标&#xff1a;数据库约束约束类型NULL约束UNIQUE&#xff1a;唯一约束DEFAULT&#xff1a;默认值PRIMARY KEY&#xff1a;主键FOREIGN KEY&#xff1a;外键CHECK 表的设…

django|报错SQLite 3.8.3 or later is required的解决方案

迁移原同事写的程序&#xff0c;到新服务器上边。运行报错。解决方案有三种 降低django版本升级sqlite3&#xff0c;不低于3.8.3版本修改django源码 方案一、降低django版本 卸载高版本django pip uninstall django安装低版本&#xff0c;如 pip install django2.1.7注意&…

Linux的目录的权限

目录 目录的权限 目录的权限 1、可执行权限: 如果目录没有可执行权限, 则无法cd到目录中. 2、可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容. 3、可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件. 上面三个权限是…