gcc/g++(默认动态链接)
- 预处理(-E):展开头文件,宏替换,删除注释,条件编译;
- 编译(-S):编译器对经过预处理后的程序进行编译,检查语法,生成汇编代码;
- 汇编(-c):转换为二进制代码,并生成目标文件;
- 链接:链接器对目标文件和用到的函数库进行链接,合成可执行程序,寻找对应声名生成可执行文件。
- 指令选项:gcc [选项] 编译文件 [选项] [目标文件]
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面;
-S 编译到汇编语言不进行汇编和链接;
-c 编译到目标代码;
-o 文件输出到文件;
-static 生成的文件采用静态链接,比动态链接文件大;
-g 生成调试信息。GNU 调试器可利用该信息;
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库;
-O0;-O1;-O2;-O3
编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高;
-w 不生成任何警告信息;
-Wall 生成所有警告信息。
注意: g++编译C代码,因为C++的编译环境基本涵盖C,而使用gcc编译C++代码,很容易报错。
gdb
Linux gcc/g++出来的二进制程序,默认是release模式
- 事前:
disassemble:在gdb中查看汇编代码
ni 汇编中执行下一句
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行
list/l 函数名:列出某个函数的源代码
r/run:运行程序
n/next:逐过程
s/step:逐语句
break/b 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息
finish:执行到当前函数返回,然后挺下来等待命令
print/p:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值
set var:修改变量的值
continue/c:从当前位置开始连续而非单步执行程序
run/r:从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info/i breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info/i locals:查看当前栈帧局部变量的值
ctrl + d/quit:退出gdb - 事中:
将gdb附加到进程上:gdb -p [pid] pid == ps aux |grep [可执行程序] - 事后:
磁盘约束:umlit -a >> core sile size >> (unlimited)
程序崩溃产生coredump文件
make/makefile:make -f (文件名称) 解释一个文件
- 格式:
目标对象:依赖对象 out : a.o b.o c.o
编译命令 gcc $^ -o $@
all : sss ddd %.o : %.c
sss:qqq gcc -c $< -o $@
#$^:所有依赖对象; #<:第一个依赖对象; $@:目标对象;
- 解释规则:
①若依赖对象不存在,则会在当前makefile中查找产生依赖对象的语句执行
②类似递归实现,自动补全仅仅是删除文件名后缀,认为剩余是原文件名字,即依赖对象与源码名称 - 项目清理: 使用 make : clean
clean :
rm a.o b.o c.o out
- 自定义变量与 . PHONY:(伪目标名称)
BIN = out
SRC = $(wildcard *.c) #*.c:匹配所有.c文件; $:解引用
OBJ = $(patsubst %.c,%.o,$(SRC))
CFLAGS = -g
$(BIN) : $(SRC)
gcc $^ -o $@
%.o : %.c
gcc $(CFLAGS) -c $< -o $@ #在链接阶段加入指令
git
- 安装 git :
yum install git
- 下载项目到本地:
git clone [url]
- 将代码放到下载好的目录中:
git add [文件名]
- 提交改动到本地:
git commit .
- 同步到远端服务器上:
git push
指令:
- ldd:查询可执行程序连接的情况
- file:查询可执行程序的文件属性
- md5sum:判断MD5码是否相同