首页 > 系统相关 >linux编译器:gcc/g++的使用

linux编译器:gcc/g++的使用

时间:2023-12-25 18:13:50浏览次数:43  
标签:文件 gcc ++ 代码 编译 编译器 链接

原文连接:https://blog.csdn.net/weixin_72060925/article/details/131274627

原文链接:https://blog.csdn.net/qq_65207641/article/details/128629904

一、编辑器与编译器的区别
  vim是代码编辑器,代码编辑器的功能是让我们输入代码的。所以从这个角度出发,我们常见的记事本也可以算作一个代码编辑器,只不过这个编辑器没有高亮等功能。而我们今天介绍的代码编译器的功能是把编辑器中写入的代码翻译为机器能够听懂的语言并生成可执行文件。所以这二者是有本质区别的。

gcc是用来编译C语言代码的,g++是用来编译C++代码的。这两个编译器在指令和编译过程等方面几乎是一样的。

二、C语言编译的过程

  1. 预处理(进行头文件展开,条件编译,宏替换,去注释等,最后生成 .i类型的文件)
  2. 编译(将C语言生成汇编语言,最后生成 .s类型的文件)
  3. 汇编(将C语言生成可重定位的目标二进制文件,最后生成 .o类型的文件)
  4. 链接(将 .o文件与库文件某种合并生成可执行程序)

1. 预处理

  预处理过程主要作用是将代码中的宏定义进行替换,同时将头文件写入到我们代码的前面,除此以外还会去掉我们写的注释。

  g++ -E A.cpp -o A.i

  • g++是指我们想要用的编译器是g++
  • 选项“-E”,该选项的作用是让 g++ 在预处理结束后停止编译过程。
  • “A.cpp”是需要被处理的c++代码。
  • 选项“-o”是指要生成的目标文件,“A.i”是我们目标文件的名字,“.i”文件为已经过预处理的C原始程序。

 打开hello.i文件:

 对比 .c源文件经过预处理之后发现 头文件,条件编译,宏,注释等都被处理了。

2. 编译

以g++为例,在编译阶段,编译器会将预处理过后的C++文件翻译为汇编语言的文件。

g++ -S A.i -o A.s

 用vim打开 hello.s

我们可以发现此时c语言代码已经变成了汇编代码,编译完成。

3. 汇编

在汇编阶段,编译器会将编译后的汇编文件翻译为二进制文件。

g++ -c A.s -o A.o

 打开hello.o 文件

 我们发现一堆乱码,因为汇编之后生成的是机器可识别代码,是我们人类无法理解的,我们无需在意,只需要明白汇编完成就行了。

4.链接(生成可执行文件)

在预处理阶段,编译器会将头文件的内容拷贝到我们写的代码文件中。这里就会有一个问题,头文件中只写了函数的声明,也就是说头文件的作用仅仅是告诉编译器这个函数的的确确存在,但是并没有告诉编译器这个函数到底是怎么实现的,函数的具体实现是写在库文件中的。我们此处介绍的链接其实就是将我们的代码和这些写有函数实现的库文件之间构建联系,从而生成一个可执行文件。

写有函数实现的库文件分为两大类,一类是静态库,一类是动态库。

如果是静态链接的话,编译器就会将静态库中的代码实现拷贝到我们的代码中。这种静态链接的方式有好处也有坏处。好处在于,如果我们的静态库丢失了,由于我们已经对函数实现进行了拷贝,所以代码文件是独立的,依旧可以正常运行。但坏处也显而易见,由于该过程进行了大量的拷贝工作,所以会浪费很多空间。

动态链接则与之相反,动态链接并不会将代码实现进行拷贝,而是和动态库建立一种联系,从而让编译器了解到函数的具体实现。由于很多代码文件都和一个动态库建立联系,所以动态库又叫做共享库。那么这么做有什么优点呢?首先,由于动态链接并不会将代码拷贝到文件中,所以动态链接的方式能够节约大量的空间。缺点也显而易见,如果动态库发生了丢失,那么该文件将无法执行。

g++ A.o -o A

 运行一下该程序

 

标签:文件,gcc,++,代码,编译,编译器,链接
From: https://www.cnblogs.com/direwolf22/p/17926680.html

相关文章

  • Windows环境 CMake 配置C++调用Python
    #CMakeLists.txtadd_library(python3STATICIMPORTED)#这里是使用python的安装路径set_target_properties(python3PROPERTIESIMPORTED_LOCATION"D:/python/libs/python39.lib")#使用python的静态库target_link_libraries(TestDemo......
  • CLR/C++回调函数callback和C# delegate的互相转换
    在进行CLR/C++进行开发的时候会经常遇到C++回调函数和C#的delegate之间的相互转换,例如在C++非托管类型的代码中的回调函数需要使用C#类的函数,或者是在C#代码中需要使用非托管C++的函数,这时候就需要在回调函数和delegate代理之间进行转换。C++:回调函数:typedefvoid(*pfunc)(in......
  • c++实现mp3
    c++实现http_mp4......
  • C++U3-第06课-算法入门
    学习目标求和符号  连乘符号  指数     对数    算法概念与复杂度计算           vector向量容器      遍历 【思路分析】1、定义vector容器和变量n2、输入n3、输入n个......
  • 闲来无事!用C++采集天气预报信息
    最近比较闲,打算休年假,连着过年一起休,保守估计有20天,想利用这几天出去旅个游,关键不知道去哪里好,天气情况怎么样。因此,我写了一个爬取往年天气信息的爬虫程序,他可以自动采集目的地的往年几年的未来天气情况,并建立数据库做具体分析。#include<iostream>#include<string>#include<......
  • /opt/rh/devtoolset-9/root/usr/libexec/gcc/x86_64-redhat-linux/9/ld: 找不到 -lz
    我用的cmake命令是:target_link_libraries(${MyProjectName}-L/usr/lib64/mysql-lmysqlclient-lpthread-lz-lm-lssl-lcrypto-ldl) 将${MyProjectName}这个目标(可执行文件或库文件)链接到以下的库文件:/usr/lib64/mysql/libmysqlclient.so/usr/lib64/libpthread.so/usr/l......
  • C++ /内存文件使用例程
    ///c++内存文件使用例程classMemoryBuffer:publicstd::strstreambuf{public:usingBase=std::basic_streambuf<char>;usingchar_type=typenameBase::char_type;MemoryBuffer(char*buf,size_tlen):std::strstreambuf(buf,l......
  • Qt&&C++ 实现Tcp Server
    关于Qt&C++实现Tcp服务器的一些简易使用笔记... "材料"准备#include<QTcpServer>//Server需要包含该头文件,Client则不用#include<QTcpSocket>#include<QHostAddress>服务器流程简要1.实例化一个QTcpServer对象:  QTcpServer*server=newQTcpServer(this);2......
  • 设计模式<c++> (3)观察者模式
     /***ObserverDesignPattern**Intent:Letsyoudefineasubscriptionmechanismtonotifymultipleobjects*aboutanyeventsthathappentotheobjectthey'reobserving.**Notethatthere'salotofdifferenttermswithsimilarme......
  • 人工智能算法原理与代码实战:从Python到C++
    1.背景介绍人工智能(ArtificialIntelligence,AI)是一门研究如何让计算机模拟人类智能的学科。它涉及到多个领域,包括机器学习、深度学习、计算机视觉、自然语言处理、机器人等。随着数据量的增加和计算能力的提升,人工智能技术的发展得到了极大的推动。在过去的几年里,人工智能的研究......