作者:小卢
专栏:《Linux》
喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》
目录
1.gcc/c++的概念:
2.程序编译过程详解:
2.1程序编译过程:
2.2gcc指令:
2.3在Linux中如何实现四种过程
2.3.1如何直接生成可执行程序呢?
2.3.2预处理过程:
2.3.3编译过程:
2.3.4汇编过程:
2.3.5链接过程:
3.动态库和静态库:
3.1动态库和静态库的区别:
3.2linux中如何区别静态库和动态库:
编辑3.3如何进行静态链接:
4.make/Makefile自动化构建工具
4.1依赖关系&&依赖方法:
4.2清理:
4.3使用make不成功的常见原因及解决方法:
gcc/g++为Linux中的编译器。
程序编译分为四个过程:
1.预处理 2.编译 3.汇编 4.链接
gcc 选项 编译后的文件 编译的文件
后面会有演示。
gcc 文件名 可以将文件直接编译成一个a.out的可执行程序
当需要生成一个需要由指定文件名的可执行程序如何操作呢?
-o为目标文件
gcc -o myfile myfile.c
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
“.i”文件为已经过预处理的C原始程序
“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
gcc -E myfile.c -o myfile.i
可以对比一下预处理过后两者的代码:
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
编译操作可以从.c文件开始,也是从点.i文件。
gcc -s myfile.i -o myfile.s
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
gcc -c myfile.s
在成功编译之后,就进入了链接阶段。
gcc -c myfile.s -o myfile.o
概念引入:
你是一名刚上高中的学生,你在上高中前就向振华中学的学长打听了网吧的位置,你的学长跟你说:校门口出去往右走两百米就可以看见一件网吧。你来了振华中学一两个星期了,当周六日的时候,你写完了数学和英语作业,你想先出去上网打一会永劫无间放松放松再回来写物理作业和化学作业。因此你就这么干了。
网吧有很多个电脑,你每次去网吧都是不同的机子,每台机子都是每个人都可以去上网的,因此这台机子是共享机子。
当你爸爸因为你考了年级第一时,给你买了改电脑,你可以用你自己的电脑来打永劫无间放松了。你不再需要去网吧了,有一天这个网吧被举报了,大家不可以去上网了,但你有你自己的机子因此你不受影响。
你自己的机子相当于静态库,而网吧的机子相当于动态库
那静态库比较好?两者的区别呢?
静态库和动态库两者的表示不同:
1.静态库: libXXXXXX.a
2.动态库: libXXXXXX.so
-static 静态链接选项
gcc myfile.c -o myfile-static -static
使用静态链接是需要有静态库的,当没有静态库时,会出现下面这种情况
如何安装静态库?
sudo yum install -y glibc-static
一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
clean:换行后删除语句
但是一般我们这种clean的目标文件,我们将它设置为伪目标
用 .PHONY 修饰,伪目标的特性是,总是被执行的。
当你文件已经是最新版本时,系统就认为你不需要在进行make操作就会报这样的报错
如果我们想要make的话,需要将源文件改一下然后再make就可以成功啦
我们可以通过时间来判断文件是否是最新的!
stat 文件名 可以查看时间
touch可以更改为最新时间