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么????

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值