您现在的位置是:首页 >技术教程 >【Linux】2.3 编译器—gcc/g++ && 项目自动化构建工具—make/Makefile网站首页技术教程

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

fantasy_13_7 2024-06-17 10:19:00
简介【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

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。