【Linux】Linux环境基础开发工具使用(gcc/g++使用)

⭐博客主页:️CS semi主页
⭐欢迎关注:点赞收藏+留言
⭐系列专栏:Linux
⭐代码仓库:Linux
家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们的支持是我创作最大的动力,欢迎友友们私信提问,家人们不要忘记点赞收藏+关注哦!!!

Linux环境基础开发工具使用(gcc/g++使用和git的使用)

  • 前言
  • 一、gcc
    • 1、简单编译
    • 2、预处理(进行宏替换)
    • 3、编译(生成汇编)
    • 4、汇编(生成机器可识别代码)
    • 5、链接(生成可执行文件或库文件)
    • 6、快速记忆
  • 二、函数库(静态库和动态库)
    • 1、引例:ldd指令看库的位置
    • 2、库的定义(库本质也是文件)
      • (1)静态库
      • (2)动态库
    • 3、总结
  • 三、Linux项目自动化构建工具make/Makefile
    • 1、背景
    • 2、概念
    • 3、内置一个简单的gcc命令
      • (1)生成项目
      • (2)清理项目
      • (3)解释为何创建要make而清理却是make clear
      • (4)两次make
      • (5).PHONY:
    • 4、依赖关系和依赖方法
      • (1)依赖方法
      • (2)依赖关系
  • 四、sudo


前言

我们进入gcc/g++章节,下面我们用myfile.c文件进行讲解展示。
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第1张图片


一、gcc

1、简单编译

gcc 文件名 -o 要命名的文件

-o后面跟着的是我们目标生成的文件。

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第2张图片

2、预处理(进行宏替换)

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第3张图片
左边为源代码,右边为预处理完的代码。
实现了我们上面所说的预处理的功能。
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第4张图片

3、编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第5张图片
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第6张图片

4、汇编(生成机器可识别代码)

通过汇编代码生成可重定向目标二进制文件,是不可以被执行的,只把我们自己写的代码进行翻译形成二进制文件。即.obj文件。

汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第7张图片

乱码:
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第8张图片
解释不可执行:
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第9张图片

5、链接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段。
实例: gcc hello.o –o hello

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第10张图片

有静态链接和动态链接,我们跟着后面的动静态库进行讲解。

6、快速记忆

操作符:
-ESc 键盘的左上角,记忆S是大写即可。
生成的文件后缀:
-iso 镜像文件。


二、函数库(静态库和动态库)

1、引例:ldd指令看库的位置

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第11张图片

预备知识:
1、我们为什么能够在linux下进行C/C++代码的编写和编译呢?
Linux系统默认已经携带了语言级别的头文件和语言对应的库。
2、我们在安装vs2022和vs2019的时候,实际上做了一个很重要的工作是什么?
它IDE会默认给我们下载并安装语言的头文件和库文件。
3、概念:我们用的相当多的指令,比如说ls等都是用C语言写的。
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第12张图片
4、如何看待我们的指令?指令就是程序就是工具。

2、库的定义(库本质也是文件)

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用

(1)静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”

基本写法:libXXXXXX.a
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第13张图片
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第14张图片

(2)动态库

动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello

libXXXXX.so

是将动态库里的我们所用的方法的地址拷贝到我的程序里面,我们去网吧是因为我们有它的地址,靠着地址进即可。
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第15张图片

3、总结

1、库分为静态库(专门让编译器,对用户的程序进行静态链接的)和动态库(专门让编译器对用户的程序进行动态链接的)。
2、静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己可执行程序中。
3、动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己可执行程序中相关的位置。
4、静态链接成功,我们的程序不依赖任何库,自己就可以独立运行。
5、动态链接成功,我们的程序还是依赖动态库,一旦动态库缺失,我们的程序将无法运行。
6、静态库的缺点是因为自身拷贝的问题,比较浪费空间。
7、动态库的优点是因为做到可以被大家共享方法,所以真正的实现永远都是在我们对应的库中,程序内部只有地址,比较节省空间。
8、Linux默认使用的是动态链接。
在这里插入图片描述
9、一般的云服务器,默认都是只有动态库,所以我们要是想要有静态库的话,我们需要进行安装包进行链接。
安装指令为:root用户:yum install -y libc-static
普通用户:sudo yum install -y glibc-static + 自己的用户密码(这里sudo的配置在后面的第四节讲到,大家可以先去看一下下面的内容)。
c++:sudo yum install glibc-static libstdc+±static -y + 自己的用户密码

我这里已经安装过了。
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第16张图片
10、来一波静态库看看效果:
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第17张图片


三、Linux项目自动化构建工具make/Makefile

1、背景

1、会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
2、一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
3、makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
4、make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
5、make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

2、概念

make:是一个ming
makefile:是一个文件,一般都是在当前的源代码路径下。

3、内置一个简单的gcc命令

(1)生成项目

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第18张图片

(2)清理项目

目标文件对应的依赖文件列表可以是空。【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第19张图片

(3)解释为何创建要make而清理却是make clear

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第20张图片

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第21张图片

(4)两次make

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第22张图片
而我们最关键的一个问题是:我编译器怎么知道我们的可执行程序是最新的呢?我昨天make了一下创建了一个可执行程序,今天我又make一下创建原本的可执行程序,可是编译器直接不让我make了,这编译器是怎么知道我早就make过了,然后知道这已经是最新的可执行程序了呢?
回答:
我们通过对比时间来进行得知是否需要重新执行。解释一下:我们的源代码写了很长,是昨天10:05分写的,我们保存并退出,现在我们开始编译成可执行程序,到了10:06分使用了一次make,我的可执行程序就比源代码要往现在的时间来一点,所以,编译器将这两个时间作对比,可执行程序时间更往现在的时间来一点相对于源代码来讲的话,那么就第二次第三次make都不会执行,因为已经有了最新的可执行程序了,而当我们将源代码进行修改一下,那么源代码的时间就比原本生成的可执行程序要往现在的时间来一点,那么就可以用make进行编译并生成新的可执行程序。
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第23张图片

方法一:
利用touch源代码
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第24张图片

方法二:.PHONY:

(5).PHONY:

clean的关键字。
.PHONY是总是被执行的。即忽略时间。

由于我们上面的make只能执行一次,而我们的clean想执行多次怎么办呢?这就需要我们的关键字.PHONY:了。

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第25张图片

4、依赖关系和依赖方法

makefile是一个围绕依赖关系和依赖方法构建的一个自动化的工具。

(1)依赖方法

上面的文件 myfile ,它依赖 myfile .o
myfile .o , 它依赖 myfile .s
myfile .s , 它依赖 myfile .i
myfile .i , 它依赖 myfile .c

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第26张图片

(2)依赖关系

myfile依赖于myfile.c
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第27张图片

四、sudo

sudo是提权,如果想要让一个普通用户能够执行sudo的话,那需要将普通用户列为可信任的白名单里,这样就可以提权进行sudo了。
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第28张图片

所以我们怎么进行提权?
讲解:
1、我们先用su+超级用户root密码切换成root
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第29张图片
2、看一眼权限和位置为:/etc/sudoers

【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第30张图片

3、下滑大概100多行左右,找到如下图所示:
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第31张图片

4、修改并强制写入
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第32张图片

5、退出切入到普通用户看一下成效
【Linux】Linux环境基础开发工具使用(gcc/g++使用)_第33张图片

自此:告别root用户,以后用普通用户也很爽了!


家人们不要忘记点赞收藏+关注哦!!!

你可能感兴趣的:(Linux,linux,运维,服务器)