【Linux】2.3 编译器—gcc/g++ && 项目自动化构建工具—make/Makefile

「gcc/g++」

  • vim:editor
  • gcc:compiler (C)
  • g++:compiler (C++)

编译的过程:预处理——编译(C→汇编语言)——汇编(汇编语言文件→可重定向目标二进制文件<不可执行的>)——链接(生成 可执行程序)

从 预处理 直接到 链接:
指令:gcc -o [编译所生成的文件] [要被编译的文件] 或者 gcc [要被编译的文件] -o [编译所生成的文件]
-o选项后面紧跟要生成的文件名

<预处理>

  • gcc -E [要被预处理的文件] -o [预处理所生成的文件(后缀为 .i 的文件)] (预处理并生成指定文件)
    gcc -E [要被预处理的文件](预处理后默认生成 预处理后的文件)

没有 -o 指定生成的文件都会默认生成文件,以下在 编译、汇编、链接中 同样如此。

<编译>

  • gcc -S [要被编译的文件] -o [编译所生成的文件(后缀为 .s 的文件)] (编译并生成指定文件)

这里 要被编译的文件 可以是预处理生成的 .i 文件,也可以最初始的文件。

<汇编>

  • gcc -c [要被汇编的文件] -o [汇编所生成的文件(后缀为 .o 的文件)] (汇编并生成指定文件)

这里生成的 .o 文件即使有权限也无法执行。

<链接>

  • gcc -o [编译所生成的文件] [要被编译的文件]

「Link?」

  • 为什么可以在 Linux下进行C、C++ 的文件编辑和编译?

  • 因为 Linux 系统默认已经携带了语言级别的头文件和语言对应的库

在这里插入图片描述

什么是动态库、静态库

动态库(只读):共享库
感性理解:动态库——公共卫生间;静态库——自己家的卫生间

静态链接:库里的内容直接 复制 到原代码中(占空间)
动态链接:根据库的地址找到库,读取库中的内容,默认是动态链接(节省空间)

  • 查看文件是什么链接?
    指令:file [要被检查的文件]
    在这里插入图片描述

  • 动态链接改静态链接?
    指令:gcc [被编译的文件] -o [静态链接生成的文件] -static

ps.一般的云服务器只有动态库,需要安装:

yum install -y glibc-static <C>
yum instal glibc-static libstdc++-static -y <C++>

「make/Makefile」

  • make/Makefile使用示例:
[RoundBottle@VM-12-2-centos testdir]$ touch Makefile   #👉创建 Makefile 文件
[RoundBottle@VM-12-2-centos testdir]$ ll
total 28
-rw-rw-r-- 1 RoundBottle RoundBottle     0 May 12 16:48 Makefile   #👉此时已经生成了 Makefile 的文件
-rw-rw-r-- 1 RoundBottle RoundBottle    72 May  8 08:48 test1.c
-rw-rw-r-- 1 RoundBottle RoundBottle   398 May  8 10:54 test2.c
-rw-rw-r-- 1 RoundBottle RoundBottle 17513 Apr 28 11:05 test2.i
[RoundBottle@VM-12-2-centos testdir]$ vim Makefile    #👉编辑 Makefile 文件
[RoundBottle@VM-12-2-centos testdir]$ cat Makefile    #👉 查看 Makefile 文件的内容
test2:test2.c
	gcc -o test2 test2.c

.PHONY:clean
clean:
	rm -f test2
[RoundBottle@VM-12-2-centos testdir]$ make   #👉make 指令 会从上到下 读取 Makefile 文件,并默认执行第一组依赖关系和依赖方法
gcc -o test2 test2.c         #👉此处自动输入并执行了第一个Makefile中的第一个依赖方法的指令,且生成第一个目标文件
[RoundBottle@VM-12-2-centos testdir]$ ll
total 44
-rw-rw-r-- 1 RoundBottle RoundBottle    70 May 12 16:50 Makefile
-rw-rw-r-- 1 RoundBottle RoundBottle    72 May  8 08:48 test1.c
-rwxrwxr-x 1 RoundBottle RoundBottle  8360 May 12 16:51 test2   #👉生成了被编译的文件
-rw-rw-r-- 1 RoundBottle RoundBottle   398 May  8 10:54 test2.c
-rw-rw-r-- 1 RoundBottle RoundBottle 17513 Apr 28 11:05 test2.i
[RoundBottle@VM-12-2-centos testdir]$ make clean  #👉执行第二组依赖关系和依赖方法
rm -f test2   #👉自动输入并执行指令
[RoundBottle@VM-12-2-centos testdir]$ ll
total 32
-rw-rw-r-- 1 RoundBottle RoundBottle    70 May 12 16:50 Makefile
-rw-rw-r-- 1 RoundBottle RoundBottle    72 May  8 08:48 test1.c
-rw-rw-r-- 1 RoundBottle RoundBottle   398 May  8 10:54 test2.c
-rw-rw-r-- 1 RoundBottle RoundBottle 17513 Apr 28 11:05 test2.i
  • make:command

  • Makefile:file →围绕依赖关系和依赖方法构建的一个自动编译工具(首字母大写或小写都行)

  • .PHONY:总是被执行的,被这个『.PHONY』修饰的被称为伪目标

在这里插入图片描述
注:依赖文件列表可以有多个文件,每个文件之间以 空格 分割。👆

使用示例:(分别输入指令:make 、make clean)在这里插入图片描述

  • make: 'file' is up to date. → 通过比较 已经存在的编译生成的文件的时间被编译的文件的时间 来得知文件是否是最新的。在这里插入图片描述

注:指令—touch [已经存在的文件] 可以更新文件的时间(如下示例)👇
在这里插入图片描述


「补充:sudo」

对单条指令提权:sudo [command]
→ password for 现在的账户
→那 root 不就形同虚设了?!(因为每个用户都知道自己用户的密码,输入自己账户的密码就可以对指令提权。)

所以,普通用户中只有 信任用户 可以执行 sudo 指令

信任用户

  • 如何设置信任用户?
  1. 切换到 root 用户
  2. 输入指令:vim /etc/sudoers
    在这里插入图片描述在这里插入图片描述
    在该文件中写入:示例如上,最后强制保存并退出(:wq!)
  • 如何删除信任用户?
指令:userdel -r [username]

END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

畋坪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值