目录
一、基础部分
1. gcc和g++的区别
2. makfefile的编写
二、gdb调试
1.启动gdb
2.设置断点b
3.开始调试r
4.打印s/display
5.下一步n/s
6.退出q
三、调试问题
1. Segmentation fault (core dumped)
四、gcc与VS的区别
1. void fun(a){}
2. int ar[n];
3. nullptr;
一、基础部分
- gcc和g++的区别
(1) gcc是gnu组织提供一些编译器集合,所以它不单单能编译gcc,而可以编译g++。编译的原则是*.c文件按照C语言语法处理,*.cpp文件按照C++语法处理。但默认不链接C++库,需要手动链接。
(2)g++是用来编译C++的,但是C++语法本身兼容C语言。 - makefile文件编写
在编译多文件时,我们肯定不能在终端上对每个文件都输入编译命令,这是就需要一个makefile来管理多文件的编译过程,在VS中系统自动生成makefile文件,而gcc中需要手动编写。
举例:有文件main.cpp, sort.h, sort.cpp
基本版:
进阶版:
(1)先看基本版,书写顺序是一个解释的过程,先时可执行文件main由main.o和sort.o文件链接而来,.o文件由由相应的.cpp文件而来。
(2)进阶版时我们通常书写的,那他是怎么由进本版而来的,1)定义了一个file等于所有的*.o文件,缩减了链接时 *.o文件的书写,2)不再单独书写每隔编译文件,且具体的编译过程依靠系统自动推演。
(3)其他需要注意的
1)CC=g++ 自动推演时默认的是gcc
2)路径 VPTH=.
3) 如果要编译成可调式版本,需要在编译过程加-g
二、gdb调试
- gdb main 启动gdb
最后一行出现这说明启动成功,不成功大概率就是release版本(没有加-g) - 插入断点 b
插入断点:b 行号
显示断点:info break
删除断点:delete 断点号 - 启动调试 r
- 打印信息 n/display
打印一次:p 变量名
打印:display 变量名
显示:info display
删除:UNdisplay 变量号 - 下一步 n/s
不进入函数:n
进入函数:s
跳出函数:finish - 退出调试:q
三、调试问题
此节并不完全,会不断地总结
- Segmentation fault (core dumped)
(1).堆栈溢出 -》死循环
(2).非法访问 -》 1).容器为空,如mstack.top() 、mqueue.front()
2)容器的访问越界
四、gcc与VS的区别
此节并也不完全,同样会不断地总结
- void fun(a){}
void fun(a) {printf("%d\n", a);}
int main() { fun(); fun(10); }
在VS中fun(a)编译是通不过的。而在gcc中可以通过,且fun(10)打印的就是10,fun()打印的是无效数字。 - int arr[n];
在VS中,C语言无法使其通过,C++到可以定义常量const int n=10; 使其通过,因为这里的n在C++是常量,而在C语言中是常变量。
但在gcc中,直接定义int n = 10; 就可以通过。 - nullptr
g++不支持nullptr - 类中类的编译顺序
g++中,类中的类需要放在前面,不然后面成员在调用它时就是未识别的,VS中成员变量在调用它时需要放在它后边,成员方法则随意。
当然,一般情况下,我们把声明和定义分别放在.h和.cpp文件中,这要VS中只需要注意:成员方法的声明中如果调用了内层类,则需要放在这个类后面