Linux编译器-gcc/g++的使用
首先先看一下自己的linux有没有安装gcc跟gcc,如果没有安装,执行以下命令
sudo yum install -y gcc-c++
命令:gcc -v、g++ -v,分别查看gcc跟g++的版本,gcc就是用来编译C程序的编译器,g++用来编译C++程序的编译器。
默认centos7.6或者8匹配的gcc版本是4.8,基本上完全够用
背景知识
GCC是一种开放源代码的编译器,全称为GNU Compiler Collection,它可以编译多种编程语言,包括C,C++,Objective-C,Fortran,Java等。它是GNU项目的重要组成部分,使用广泛,包含了许多编译器,如gcc,g++,gcj等。GCC的主要特点是:兼容多种操作系统和处理器架构,速度较快,生成的代码质量高,可以对代码进行优化等。
gcc使用
编译过程是将源代码转换为可执行代码的过程,它包括以下几个步骤:
-
预处理:对源代码进行一些文本替换和宏展开等操作,生成预处理后的代码。
-
编译:将预处理后的代码翻译成汇编语言。
-
汇编:将汇编语言翻译成机器语言指令。
-
链接:将编译后的目标文件和使用的库文件等链接成一个可执行文件。
具体的编译过程可以用以下命令进行操作:
-
预处理:使用gcc编译器的选项-E进行预处理,如:gcc -E main.c -o main.i;
-
编译:使用gcc编译器的选项-c进行编译,如:gcc -S main.i -o main.s;
-
汇编:使用GCC编译器的选项-S进行汇编,如:gcc -c main.s -o main.o;
-
链接:将编译后的目标文件和使用的库文件等链接成一个可执行文件,如:gcc main.o -o main。
这些步骤可以分别进行,也可以一次性完成,gcc编译器会根据需要自动完成每个步骤。
链接这里涉及到一个知识点- -库函数,我们在C程序中并没用定义printf函数,但是当我们引用了头文件,但注意,头文件也只有声明并没有printf函数的定义,那么这是在哪里实现的?
- -函数库
我们把这些函数都定义到函数库中,链接期间编译器会链接到这些函数库,有静态库有动态库,简单理解就是,静态库直接是把里面的代码拷贝到自己的程序中,所以所占空间往往比较大,动态库就是给了地址,当编译要用到的时候,根据地址去函数库找。
温馨提示:-o选项暂时可以理解为重新输出文件名
Linux调试器-gdb
GDB是一款功能强大的调试工具,可以用于C、C++、汇编等语言的调试。它可以帮助程序员定位代码中的错误和问题。
以下是GDB的一些常用命令:
-
启动程序: 用gdb命令启动程序,如:gdb ./a.out。
-
设置断点: 在调试代码的过程中,可以设置断点以停止程序的执行来检查代码,命令是break或者简写为b,如:b main或b 25。
-
查看断点: 可以使用info命令查看已设置的断点信息,如:info breakpoints。
-
执行代码: 使用run或者简写为r命令执行程序,如:r。
-
单步执行: 使用step或者简写为s命令单步执行程序,按需查看变量值,如:s。
-
跳过代码: 使用next或者简写为n命令跳过一行代码,不进入函数内部,如:n。
-
继续执行: 使用continue或者简写为c命令继续执行程序,如:c。
-
查看变量: 使用print或者简写为p命令查看变量的值,如:p x。
-
修改变量: 使用set命令修改变量的值,如:set x = 10。
-
查看栈帧: 使用bt命令查看当前的栈帧信息,如:bt。
以上是GDB的一些常用命令,GDB还有很多其他的命令和功能,可以根据需要进行查阅和使用。
make和makefile
- 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
- makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建
通常我们再写一个文件,会先把makefile写好
以下是makefile文件内容,我要输出file.c的内容
file:file.o
gcc file.o -o file
file.o:file.s
gcc -c file.s -o file.o
file.s:file.i
gcc -S file.i -o file.s
file.i:file.c
gcc -E file.c -o file.i
.PYHON //修饰设置伪目标
clean:
rm -f file.i file.s file.o file
这样只要运行make,就可以得到file.i file.o file.s file文件了。如果想要清除这些文件
make clean
一般来说,我们会用clean作为清除伪目标