c语言是跨平台的,但其在windows上编译的程序是不能够在linux平台上直接执行的,需要源代码在linux平台上重新编译。
gcc在编译一个程序时,一般需要完成预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)过程。
1、编译
gcc a.c gcc a.c -o do
默认生成a.out可执行文件
2、给程序添加可执行权限
chmod +x a.out
3、执行程序
./a.out
4、查看编译过程
参数-v可以查看程序的编译过程和显示已经调用的库。
gcc -v a.c
设置编译的语言
-x 参数
cp a.c a.u
gcc -x ‘c‘ a.u
5、编译过程的控制
(1)控制预处理过程
gcc -E -o a.cxx a.c
将预处理的结果保存到a.cxx文件中
(2)生成汇编代码
gcc -S -o a.s a.c
生成汇编文件a.s
(3)生成目标代码
gcc -c -o a.o a.c
(4)链接生成可执行文件
gcc a.o -o aa.out
生成 可执行文件 aa.out
可用file命令查看文件信息,如
file aa.out
输出:
aa.out: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped
6. gdb 调试程序
gdb是一个功能强大的调试工具,可以用来调试c/c++程序。
在使用gdb调试程序时,主要进行下面5个操作:
a. 启动程序
b.设置断点
c.查看信息
d.分步执行
e.改变环境
(1)在程序中加入调试信息
为了使用gdb调试程序,需要在编译程序的时候加入调试信息,方法是在编译时使用-g参数
gcc -g -o a.debug a.c
(2)在调试程序前,需要启动gdb。
直接输入gdb
在gdb中加载需要调试的程序
在(gdb)提示符后:
(gdb) file /home/bruce/c/a.debug
Reading symbols from /home/bruce/c/a.debug...done.
(3)在gdb中查看代码
可以用list命令显示程序的源代码和断点
e.g.
list 1 //显示第一个断点前的源代码
接着按“Enter"键,显示下一个断点以前的源代码
(4)在程序中加入断点
如果自动加入 的断点不能够满足调试要求,可以用break命令增加调试的断点。
e.g.
break 6
//在程序的第6行增加一个断点
(5)查看断点
命令info breakpoint 显示程序中所有设置的断点。
(gdb) info breakpoint
Num Type Disp Enb Address What
1 breakpoint keep y 0x080483ff in max at a.c:6
2 breakpoint keep y 0x080483ff in max at a.c:6
3 breakpoint keep y 0x08048412 in main at a.c:18
(gdb) break 19
Breakpoint 4 at 0x804841a: file a.c, line 19.
(gdb) info breakpoint
Num Type Disp Enb Address What
1 breakpoint keep y 0x080483ff in max at a.c:6
2 breakpoint keep y 0x080483ff in max at a.c:6
3 breakpoint keep y 0x08048412 in main at a.c:18
4 breakpoint keep y 0x0804841a in main at a.c:19
(6)运行程序
run
程序会在第一个断点停下,输入next会进入下一行。
输入continue,则会在下一个断点处停下。
命令step也可以程序单步运行,其与next不同的时,当遇到一个函数调用,step可以进入函数内部,而next则会一步执行完函数调用。
(7)变量查看
print 命令可以在程序运行过程中查看一个变量的值。
gdb-> file a.debug -> run -> print i -> next -> print i
(8)退出
完成程序的调试后,输入 q ,退出gdb.
(9)gdb常用命令
省略..