gdb的调试以及makefile文件的编写

g++的使用

一,gcc和g++的编译区别

区别一:
1,gcc默认只连接c库,并不会连接c++的库

gcc -o mainc main.c(生成C语言)
gcc -o mainc++ mainc++.cpp -lstdc++(生成C++)

2,g++会默认c标准库和c++标准库

g++ -o mainc main.c (C语言)
g++ -o mainc++ mainc++.cpp(C++)
编译是一样

区别二
1,gcc如果编译.c文件,则按照C语言的方式编译,如果编译.cpp文件,则按照 c++的方式来编译

2,g++不管是.c文件还是.cpp文件,都是按照c++的方式进行编译

二,可执行文件有两个版本

1,debug版本 (调试版本,在编译阶段会加入某些调式信息)
可以编译时,加入-g选项,可以最终生成debug版本的可执行文件

gcc -o debug main.c -g

2,release版本 (发行版本,没有调试)->交付给用户执行的版本
gcc默认生成是release版本

gcc -o main main.c

三,gdb调试

gdb—>debug版本的可执行文件
一,显示源码:list或l(默认main函数显示的源码)

list filmname:line(行号)
(如果后期的命令需要用行号,则使用的是最后一次显示的源码的行号)

二,断点管理:
1,添加断点:
(1)b 行号(给指定的行添加一个断点)默认是给最后一次显示文件行号
(2)b 函数名 (给指定的函数实现的第一行添加一个断点)
(3) b filename:行号 (给指定的文件的行号添加一个断点)
2,查看断点

info b

3,删除断点

d 断点号(info b 命令显示的断点编号)

三,运行管理

r ->启动执行,程序会执行到逻辑上的第一个断点处
n ->逐过程 F10
s ->逐语句 F11
finish (跳出函数)
c ( 继续执行,直到下一个断点处)
u (退出循环的)
q ( 退出调试)

四,显示变量名
p 变量名 (输入一次,执行一次)
display 变量名 (在执行过程中,每执行一次,显示一次)
info display (显示所有的display信息)
undisplay display 的编号 (取消一个display)
p &valname (显示变量地址)
p ptr (显示ptr中存储的值,指向的变量的地址)
p *ptr (显示ptr指针指向的变量的值)

数组:int arr[10]={…};
p arr (显示数组中所有元素的值)

例外
void show (int arr[],int len) { }
arr是地址
p arr (显示数组的首地址)
p *arr@数组大小 (显示数组所有的值)

结构体变量

struct Node
{
int a;
int b;
int c;
}

p node (显示结构体变量中的所有成员的值)
p node.a (显示node中的a成员的值)
p pnode->a (显示a)

五,如果测试一个返回值的函数是否能够正常执行
p 函数名(传递的实参) 显示函数执行的结果

六,显示函数调用栈:bt
->公有方法:10条执行流程都需要调用这个方法
-> 给当前执行函数传递参数是否正确

makefile文件–>Linux上的工程管理工具

最原始的形式版本:
注意:
1,编译时候文件名必须是makefile, make时候才能执行
2,第二行必须是Tab键
3,不是当前路径时,编译时必须给清路径
在这里插入图片描述
clean为伪目标
生成debug版本
在这里插入图片描述
一,变量的使用
在这里插入图片描述
二,自动推导的使用,VPATH的引用(路径用环境变量代替)
在这里插入图片描述
简化
在这里插入图片描述
再简化
在这里插入图片描述
gcc生成,可以指定debug
在这里插入图片描述

库文件

静态库;(Linux .a ) Windows .lib
功能模块的源代码:list.c vector.c set.c map.c stack.c queue.c
1,将所有的源代码文件编译成中间文件
2,ar crv libxxxxxx.a(静态库文件) 所有中间文件

使用: gcc -o main main.c -L库的路径 -l库的名称

共享库(动态库)(LInux .so ) Windows .dll

生成:gcc、 -shared -fPIC -o libxxxxxxx.so 功能代码 的源文件

使用: gcc -o main main.c -L库的路径 -l库的名称

静态库:程序在连接阶段会将静态库中的内容合并到最终可执行文件中,最后可执行文件的执行并不会依赖使用的静态库(不依赖库文件)

共享库:程序在连接阶段只是对用到的共享库中的方法做了标记,并没有将方法合并操作系统加载共享到可执行文件中。所以,使用共享库生成的程序执行时,需要操作系统动态加载库到内存上来执行(程序执行时,系统动态加载库到内存)

操作系统加载共享库只会在:/lib /usr/lib

修改环境变量:LD_LIBRARY_PATH (如果只在)

配置文件:~/.bashrc

exprot LD_LIBRARY_PATH=库的绝对路径

**查看环境变量的值:**echo $LD_LIBRARY_PATH

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值