您现在的位置是:首页 >技术教程 >【Linux】2.3 编译器—gcc/g++ && 项目自动化构建工具—make/Makefile网站首页技术教程
【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 指令
信任用户
- 如何设置信任用户?
- 切换到 root 用户
- 输入指令:vim /etc/sudoers
在该文件中写入:示例如上,最后强制保存并退出(:wq!)
- 如何删除信任用户?
指令:userdel -r [username]
END