01_c语言学习之gcc
gcc常用语法
-c:只激活预处理,编译,和汇编,也就生成obj文件 .o
-S:只激活预处理和编译,就是指把文档编译成为汇编代码。
-E:只激活预处理,不生成文档,需要把他重定向到一个输出文档里。
-o:定制目标名称,缺省的时候gcc 编译出来的文档是a.out
-ansi:关闭gnu c中和ansi c不兼容的特性,激活ansi c的专有特性。
-Dmacro:相当于C语言中的#define macro
-Dmacro=defn:相当于C语言中的#define macro=defn
-Umacro :相当于C语言中的#undef macro
-Idir:指定头文件路径。
-llibrary:指定库
-Ldir:定制编译的时候,搜索库的路径。
-g:指示编译器,在编译的时候,产生调试信息。
-static:此选项将禁止使用动态库,所以,编译出来的东西,一般都很大。
-share:此选项将尽量使用动态库,所以生成文档比较小,但是需要系统由动态库。
-Wall:会打开一些很有用的警告选项,建议编译时加此选项。
-std:指定C标准,如-std=c99使用c99标准,-std=gnu99,使用C99 再加上 GNU 的一些扩展。编一是要放在-o的前面使用
优化选项:
-O0 -O1 -O2 -O3:编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
一般选择O2使用,在小写的O的前面出现 gcc -O -o bin/hello src/hello.c
文件的工程化管理:
bin: c的可执行文件
include: 自己定义的头文件
obj: .o 的目标文件
src: c 语言源文件
options常用编译选项:
.错误与告警选项
-Wall 一般使用该选项,允许发出GCC能够提供的所有有用的警告。也可以用-W{warning}来标记指定的警告。
-pedantic 允许发出ANSI/ISO C标准所列出的所有警告
-pedantic-errors 允许发出ANSI/ISO C标准所列出的错误
-werror 把所有警告转换为错误,以在警告发生时中止编译过程
-w 关闭所有警告,建议不要使用此项
gcc -Wall -o bin/hello src/hello.c -----------重要以后要常用
options制作库文件选项:
-L dir :在库文件的搜索路径列表中添加dir 目录
-static: 链接静态库
-lname: 连接名为name的库文件
-shared 表明是使用共享库
gdb调试器 作用: 调试错误
gdb常用语法:
gdb调试的是最终的可执行文件,所以必须要先对原文件进行编译
1 gcc -g 其它选项 文件名
2 gdb 可执行文件(路径+文件名) //调试可执行文件,自动进入调试界面
l(list) 查看所在入的文件
b(break) 设置断点, 程序运行到断点即可停止
break 函数名
break 行号
break 文件名:函数名
break 文件名:行号
break +偏移量
break -偏移量
break *地址
info b : 查看设置的断点情况
r (run)从第一行开始运行代码或者指定行开始, 可在r后面加上行号
p n : 查看变量n的值
n(next) 单步运行下一行代码(遇到函数不会进入函数)
s(step) 单步运行下一行代码(遇到函数会进入函数)
c(countinue): 恢复程序的运行,执行剩余的程序
删除断点通过命令包括:
delete <断点id>:删除指定断点
delete:删除所有断点
clear
clear 函数名
clear 行号
clear 文件名:行号
clear 文件名:函数名
quit 退出
示例:
gcc -g -o bin/sum src/sum.c
gdb bin/sum
(gdb ) //正常进入到gdb的时候,在左侧会出现gdb,说明正常进入了
(gdb) l //输出的是文本形式的输出从第一行开始看, 回车键查看下面的文档
(gdb) l 28 查看行号28上下10行左右的代码
(gdb) r 运行程序
(gdb) b 22 给第22行设置断点
Breakpoint 1 at 0x40052a: file src/day_1_helloword.c, line 22.
(gdb) info b 查看断点
(gdb) b main 给函数main设置断点
Note: breakpoint 1 also set at pc 0x40052a.
Breakpoint 2 at 0x40052a: file src/day_1_helloword.c, line 26.
(gdb) info b 查看断点
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040052a in main at src/day_1_helloword.c:22
2 breakpoint keep y 0x000000000040052a in main at src/day_1_helloword.c:26
(gdb) r 运行
Starting program: /home/xyy/c/c_pro/chapter2/bin/hello1
Breakpoint 1, main () at src/day_1_helloword.c:26
26 printf("hello,word!!!\n");
(gdb) c 碰到第一个断点, c 继续执行
Continuing.
hello,word!!!
[Inferior 1 (process 5074) exited normally]
(gdb)p 变量名 //查看变量的值
disassemble main 查看汇编代码