[Linux服务器] Linux---gcc/g++工具

63 0
Honkers 2025-8-30 05:38:03 来自手机 | 显示全部楼层 |阅读模式

目录

gcc/g++基本了解

基本指令

程序的翻译过程

1、预处理

2、编译

3、汇编

4、链接

动静态库/动静态链接

动态库

静态库

相关指令


gcc/g++基本了解

在Linux中,gcc/g++是用来编译链接形成可执行程序的工具。gcc是C语言的编译器,g++是C++的编译器。

gcc只能编译C,g++即可以编译C还可以编译C++。

基本指令

安装gcc/g++

  1. sudo yum install -y gcc #安装gcc
  2. sudo yum install -y gcc-c++ #安装g++
复制代码
  1. gcc 指定.c文件 #编译指定.c文件,形成可执行程序(在当前目录下,默认的可执行程序名为a.out)
  2. g++ 指定.cpp文件 #编译指定.cpp文件,形成可执行程序(在当前目录下,默认的可执行程序名为a.out)
  3. #选项
  4. -o:可指定编译链接之后形成的可执行程序名称,一般后接名称
复制代码

举个例子

这里使用gcc和g++分别编译链接test.c和test.cpp文件。运行时,执行./可执行文件名 即可。

  1. ./c.exe #执行可执行程序c.exe
  2. ./cpp.exe #执行可执行程序cpp.exe
复制代码

程序的翻译过程

1、预处理

程序在预处理阶段,需要完成头文件展开、去注释、宏替换、条件编译等操作。

  1. -E #文件开始编译链接,完成预处理操作之后就停下来。
复制代码

举个例子

  1. gcc -E test.c -o test.i #开始编译链接test.c文件,预处理结束之后就停下来。
复制代码

浅看一下

 main函数之前全是stdio.h的头文件展开和#define的宏替换。可以看出,去注释和条件编译也体现出来了。

  1. -D A=10 #在gcc命令中使用,在编译的时候顺便定义宏
复制代码
  1. gcc -E test.c -o test.i -D B=10
复制代码

 浅看一下 

在预处理阶段,程序还是我们能看懂的原语言。

2、编译

编译阶段,程序会被编译成汇编代码。

  1. -S #程序开始编译链接,编译结束后停下来。
复制代码
  1. gcc -S test.c -o test.s
复制代码

浅看一下

3、汇编

汇编阶段,程序会被翻译成可重定位目标二进制文件(目标文件)

  1. -c #程序开始编译链接,汇编结束后停下来。
复制代码
  1. gcc -c test.c -o test.o
复制代码

浅看一下(由于vim是文本编辑器,所以是以文本的方式打开test.o的,dan实际上test.o是二进制文件,所以这里会出现乱码)

4、链接

在链接阶段,二进制文件要和标准库文件进行链接,最终实现可执行程序文件。

  1. gcc test.c -o c.exe #从test.c文件开始编译链接(从预处理开始),实现可执行程序
  2. gcc test.o -o c.exe #从test.o文件开始编译链接(从链接开始),实现可执行程序
复制代码

链接被分为静态链接和动态链接,一般gcc/g++都是动态链接。

动静态库/动静态链接

静态链接和动态链接都各自依赖静态库和动态库。

动态库Linux系统本来就有,静态库需要自己安装。

  1. sudo yum install -y glibc-static #安装C静态库
  2. sudo yum install -y libstdc++-static #安装C++静态库
复制代码
  1. ll /lib64/libc.a #查看C静态库是否存在
  2. ll /lib64/libstdc++.* #查看C++静态库是否存在
复制代码

能看到这两个文件说明C/C++库已安装。

Linux和Windows中库后缀名

库的后缀名LinuxWindows
动态库.so.dll
静态库.a.lib
  1. ldd 指定可执行程序 #查看指定可执行程序所依赖的库文件
复制代码

比如说.c/.cpp中使用了printf函数/std::cout函数,这些函数都是在stdio.h/iostream头文件中的。在形成了二进制文件之后,由于在源代码中只是使用了这样的函数,但是没有实现部分,实现部分在stdio.h/iostream头文件中的。动静态库则是打包实现好了这种函数供我们调用。所以程序翻译过程最后一步需要链接,才能得以形成最终的可执行程序文件,这也是动静态库的意义。

使用动态库的这种链接称为动态链接,使用静态库的链接称为静态链接。且动态链接必须使用动态库,静态链接必须使用静态库。

库的本质就是打包实现好了的大家公用的函数,提高开发效率。

库都是二进制文件。

动态库

动态库就是可执行程序通过编译器所获得的公共地址。当程序运行到特定的函数时,程序可以通过这个公共的地址去访问库中对应的方法实现,完成这个调用函数的操作,完成之后回到程序中继续执行接下来的指令。

动态库比较节省资源。大家都从公共的地方去找。但是一旦损坏,就都不能用了。

静态库

静态库就是将特定的函数的实现部分,从库中找到并拷贝到源文件中去。

静态库不依赖库文件,同类型平台都可以直接使用。缺点就是可执行程序的体积比较大。

动态链接是gcc/g++默认的,静态链接需要带上-static选项。

相关指令

  1. -static #使用静态链接
复制代码
  1. gcc test.c -o c.exe #动态链接形成可执行程序
  2. gcc test.c -o c_static.exe -static #静态链接形成可执行程序
复制代码

浅看一下

刚刚程序翻译过程是以C语言举例的,C++也一样,要编译C++程序以及动静态链接形成可执行程序,只需将gcc改为g++即可!

最后,如有不足,请各位大佬指正!!!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行