-
G++重要编译参数
- -g(GDB调试)
- -g选项告诉gcc产生能被GNU调试器GDB使用的调试信息,以调试程序
- 编译带调试信息的可执行文件
- g++ -g hello.c -o hello
- 编译过程:
- -E(预处理)
- g++ -E hello.c -o hello.i
- -S(编译)
- g++ -S hello.i -o hello.s
- -c(汇编)
- g++ -c hello.s -o hello.o
- 链接
- g++ hello.o -o hello
- -E(预处理)
- -O[n]
- 优化源代码
- -O0:表示不做优化
- -O1:为默认优化
- -O2:除了完成-O1的优化之外,还进行一些额外的优化工作,如指令调整等(一般使用这个即可满足要求)
- g++ -O2 hello.c -o hello
- time
- time ./hello
- 可以带引该可执行文件的执行时间
- time ./hello
- -l(指定库文件、-L(指定库文件路径)
- 在/lib、/usr/lib及/usr/local/lib里的库直接-l参数就能链接
- 例:链接glog库
- g++ -lglog hello.c -o hello
- 例:链接glog库
- 如果库文件没放在以上三个目录里,需要使用-L参数指定库文件所在目录
- 例
- g++ -L/home/wangxianyue/hellolibfolder -lhello hello.c -o hello
- 例
- 在/lib、/usr/lib及/usr/local/lib里的库直接-l参数就能链接
- -I(指定头文件搜索目录)
- /usr/include一般是不用指定的,gcc知道去;但如果头文件不在这里,就需要使用-I参数进行指定了。
- 例:头文件放在当前目录中
- g++ -ImyInclude hello.c -o hello
- 例:头文件放在当前目录中
- /usr/include一般是不用指定的,gcc知道去;但如果头文件不在这里,就需要使用-I参数进行指定了。
- -Wall(打印警告信息)
- g++ -Wall hello.c -o hello
- -w(关闭打印信息)
- g++ -w hello.c -o hello
- -std=c++11(设置编译标准)
- g++ -std=c++11 hello.cpp -o hello
- -o(指定输出文件名)
- g++ hello.c -o hello
- -D(定义宏)
- g++ -DDEBUG hello.c -o hello
- -g(GDB调试)
-
g++命令行编译(命令实战)
- -I命令(直接编译)
- 生成库文件并编译
- 1. 生成静态库(编译时链接)
- 步骤1:先进入src目录下
- 步骤2:先生成.o的汇编文件
- 步骤3:生成静态库libSwap.a
- 步骤4:回到上级目录
- 步骤5:链接,生成可执行文件static_main(-l会自动省略lib及.a,故直接输入-lSwap即可)
- 步骤6:运行static_main即可(./static_main)
- 生成动态库(运行时链接)
- 步骤1:进入src目录下
- 步骤2:生成动态库libSwap.so
- 步骤3:回到上级目录
- 步骤4:链接,生成可执行文件dynamic_main
- 步骤5:运行
-
常用调试命令参数
- GDB调试器:
- 用来调试C/C++程序的功能强大的调试器,是linxu系统开发C/C++最常用的调试工具
- 程序员可以使用GDB来跟踪程序中的错误,从而减少程序员的工作量
- linxu开发C/C++一定要熟悉GDB
- VScode是通过调用GDB调试器来实现C/C++的调试工作的
- Windows系统中,常用的集成开发环境(IDE),如VS,VC等,他们内部已经嵌套了相应的调试器
- GDB主要功能:
- 设置断点(断点可以使条件表达式)
- 使程序在指定的代码上暂停执行,便于观察
- 单步执行程序,便于调试
- 查看程序中变量值的变化
- 动态改变程序的执行环境
- 分析崩溃程序产生的core文件
- 常用调试命令参数
- 调试开始:执行gdb exefilename,进入gdb调试工具,其中exefilename为要调试的可执行文件名
- 参数
- help(h):查看命令帮助,具体命令查询在gdb中输入help + 命令
- run(r):重新开始运行文件
- start:单步执行,运行程序,停在第一行执行语句
- list(l):查看源代码,(list n:从第n行开始查看代码;list 函数名:查看具体函数)
- set:设置变量的值
- next(n):单步调试(逐过程,函数直接执行)
- step(s):单步调试(逐语句,跳入自定义函数内部执行)
- backtrace(bt):查看函数的调用的栈帧和层级关系
- frame(f):切换函数的栈帧
- info(i):查看函数内部局部变量的数值
- finish:结束当前函数,返回到函数调用点
- continue(c):继续执行(跳到下一个断点)
- print(p):打印值及地址
- quit(q):退出调试
- break+num(b):在第num行设置断点
- info breakpoints:查看当前设置的所有断点
- delete breakpoints num(d):删除第num个断点
- display:追踪查看具体变量值
- undisplay:取消追踪观察变量
- watch:被设置观察点的变量发生修改时,打印显示
- i watch:显示观察点
- enable breakpoints:启用断点
- disable breakpoints:禁用断点
- x:查看内存
- run argv[1] argv[2]:调试时命令行传参
- set follow-fork-mode child:#Makefile项目管理,选择跟踪父子进程(fork())
- Tips:
- 编译程序时,需要加上-g参数,之后才能进行gdb调试,gcc -g hello.c -o hello
- 回车键,重复上一命令
- GDB调试器:
- 1. 生成静态库(编译时链接)