• 编译过程 & 学习 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 

    一般来说:被 `<>` 符号包裹的头文件,例如 ``一般是从系统的环境目录中搜索,搜索不到就从指定的路径中搜索(这个指定的目录被保存在 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么????

  • 相关阅读:
    花粉状二氧化硅纳米球 Pollen silica nanospheres的产品规格描述
    APP广告竞价机制:头部竞价与瀑布流
    3个变化3秒区别MT4和MT5
    java servlet校园闲置商品交易平台的设计与实现源码
    LabVIEW专栏八、类
    JavaWeb笔记
    【微信小程序 | 实战开发】实现ES6转ES5开关
    LeetCode-组合总和 II
    黑客(网络安全)技术速成自学
    直流无刷电机FOC控制算法 理论到实践 —— 实践
  • 原文地址:https://blog.csdn.net/qq_41764621/article/details/134274156