gcc/g++/gdb

目录
一、基础部分
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;

一、基础部分

  1. gcc和g++的区别
    (1) gcc是gnu组织提供一些编译器集合,所以它不单单能编译gcc,而可以编译g++。编译的原则是*.c文件按照C语言语法处理,*.cpp文件按照C++语法处理。但默认不链接C++库,需要手动链接。
    (2)g++是用来编译C++的,但是C++语法本身兼容C语言。
  2. 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调试

  1. gdb main 启动gdb
    在这里插入图片描述
    最后一行出现这说明启动成功,不成功大概率就是release版本(没有加-g)
  2. 插入断点 b
    插入断点:b 行号
    显示断点:info break
    删除断点:delete 断点号
  3. 启动调试 r
  4. 打印信息 n/display
    打印一次:p 变量名
    打印:display 变量名
    显示:info display
    删除:UNdisplay 变量号
  5. 下一步 n/s
    不进入函数:n
    进入函数:s
    跳出函数:finish
  6. 退出调试:q

三、调试问题

此节并不完全,会不断地总结

  1. Segmentation fault (core dumped)
    (1).堆栈溢出 -》死循环
    (2).非法访问 -》 1).容器为空,如mstack.top() 、mqueue.front()
    2)容器的访问越界

四、gcc与VS的区别

此节并也不完全,同样会不断地总结

  1. void fun(a){}
    void fun(a) {printf("%d\n", a);}
    int main() { fun(); fun(10); }
    在VS中fun(a)编译是通不过的。而在gcc中可以通过,且fun(10)打印的就是10,fun()打印的是无效数字。
  2. int arr[n];
    在VS中,C语言无法使其通过,C++到可以定义常量const int n=10; 使其通过,因为这里的n在C++是常量,而在C语言中是常变量。
    但在gcc中,直接定义int n = 10; 就可以通过。
  3. nullptr
    g++不支持nullptr
  4. 类中类的编译顺序
    g++中,类中的类需要放在前面,不然后面成员在调用它时就是未识别的,VS中成员变量在调用它时需要放在它后边,成员方法则随意。
    当然,一般情况下,我们把声明和定义分别放在.h和.cpp文件中,这要VS中只需要注意:成员方法的声明中如果调用了内层类,则需要放在这个类后面
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值