您的位置:首页 > 运维架构 > Linux

Linux gcc,gdb命令及vim配置

2015-11-20 21:03 423 查看
Linux下c/c++开发工具及配置

在linux下进行从c/c++程序开发,与window上很不一样,在windows上有很好的集成开发环境,直接安装软件按照步骤来就行,这种集成方式很简单好用。在linux下没有这种较好的集成环境,都是通过多个小工具组合在一起实现强大的功能,因此这样比较自由,对于程序开发具有良好的定制性;这里使用的系统是centos6.7.

linux下开发从c/c++需要的几个主要工具:

vim:编辑器(emacs)

gcc:编译器

gdb:调试器

gcov, gprof:性能分析工具

。。。

一、vim编辑器

前面已经对vim编辑器的基本操作和命令有了一个基本的认识,它是一个强大的文本编辑器,之前写shell脚本默认使用了它的配置。但是在这里我们需要写c/c++,这个语言有其本身的特性,在文件格式和缩进方面都需要进行配置,以使我们的开发变的简单快捷,就如在vs中编辑代码一样,看了多个配置教程,基本实现了相关的配置,下面详细介绍:

输入vim –version可以得到系统中vim配置文件的位置,一般在/etc/下有个vimrc文件,这个文件对所有用户都有效。一般用户自己可以建立自己的配置文件,命名为.vimrc。可以将/ect/下的vimrc文件复制到用户目录下改名为.vimrc,然后修改.vimrc文件进行配置就可以实现用户的vim c/c++配置;注意在这里.vimrc文件用ls是不可见的。例如我的用户路径为/home/centos/;执行下面两步就可以实现上面的功能:

#切换到/etc/目录
......................$ cd /etc/
[centos@localhost etc]$ cp vimrc /home/centos/
#切换到用户目录
....................$ cd /home/centos/
[centos@localhost ~]$ mv vimrc .vimrc


接下来vim .vimrc打开配置文件;在文件中添加相关内容,wq保存即可,下一次打开vim时就能实现配置的功能了:

设置Windows风格的C/C++自动缩进(添加以下set语句到vimrc中)

1)设置(软)制表符宽度为4:

set tabstop=4

set softtabstop=4

2)设置缩进的空格数为4

set shiftwidth=4

3)设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置:

set autoindent

4)设置使用 C/C++ 语言的自动缩进方式:

set cindent

5)设置C/C++语言的具体缩进方式(以我的windows风格为例):

set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s

6)如果想在左侧显示文本的行号,可以用以下语句:

set nu

我的就加了这些东东基本就可以了;

详细可以参考:http://www.linuxidc.com/Linux/2012-09/70299.htm

二、gcc编译器

gcc编译器是GUN开源的,是一个强大的c/c++编译器,开可以编译java等其他语言。是在linux上进行c/c++开发的首选编译器。个人的系统上已经装好了gcc和gdb等工具,这里不再详细介绍安装方法(安装实在是太复杂了),可以通过输入gcc –version查看系统是否安装有gcc。

对于c源程序到目标可执行代码需要经过下面几个阶段:

C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件

相应的有几个文件过程:源程序文件 -> 汇编代码文件 -> 可执行文件

gcc命令常用参数:

-o filename   指定输出文件名;编译过程中,filename为指定输出文件名,默认为a.out

-c       对文件进行编译和汇编,但不进行连接,生成目标文件.o

-S       对文件进行编译,但不汇编和连接,生成汇编代码

-E       仅对文件进行预编译处理

-Wall     显示附加的警告信息

-g       包含调试信息以便调试(调试标记)

  

-O1/O2/O3  对代码进行优化,数字越大优化等级越高

-pedantic 严格符合ANSI标准

-v       查看gcc版本

单个文件的编译过程:

1. 预处理

gcc -E test.c -o test.i

可以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明

白了。没有-o的话会在命令行窗口直接输出预处理后的代码。

gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。

2. 编译

汇编代码(Compilation)预处理之后,可直接对生成的test.i文件编译,生成汇编代码:

gcc -S test.i -o test.s

gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

3. 汇编(Assembly)

对于上一小节中生成的汇编代码文件test.s,gas汇编器负责将其编译为目标文件,如下:

gcc -c test.s -o test.o

4. 连接(Linking)

gcc连接器是gas提供的,负责将程序的目标文件与所需的所有附加的目标文件连接起来,最终生成可执行文件。附加的目标文件包括静态连接库和动态连接库。

对于上一小节中生成的test.o,将其与C标准输入输出库进行连接,最终生成程序test

gcc test.o -o test

注意第三步生成的.o文件不能直接运行,必须通过第四步的链接过程才能得到完整的可执行文件,输入./test 就能运行可执行文件,输出结果;

最直接的方式是gcc test.c 可以直接生成可执行文件默认文件名为a.out。即在gcc中-E, -S, -c每一步都会默认包含上一步的操作,即-S处理源文件也是可以的,它会自动先进行-E处理。

注意:在gcc处理单个文件是,若没有-o指定输出文件,-E会直接输出代码到屏幕,-S会自动生成一个.s文件,-c会生成一个.o文件,直接gcc会生成可执行文件a.out;

链接库

编译程序时,需要链接不同的头文件和库文件,这些文件一般在系统的默认目录下,gcc会自动去寻找,但有时候需要用到第三方库,这时gcc寻找不到,就需要进行指定了。

gcc中有下面几个命令用来添加搜索路径:

-I dir :头文件搜索列表添加目录dir

-L dir :库文件搜索列表添加目录dir

-static :强制链接静态库

多个源程序的编译

通常整个程序是由多个源文件组成的,相应地也就形成了多个编译单元,使用GCC能够很好地管理这些编译单元。假设有一个由test1.c和 test2.c两个源文件组成的程序,为了对它们进行编译,并最终生成可执行程序test,可以使用下面这条命令:

gcc test1.c test2.c -o test

对于比较复杂的项目工程,文件较多,直接使用gcc会比较复杂,这里就需要make工具了,这个后面再介绍。

三、gdb调试器

程序开发过程中免不了会有一些错误出现,那么就需要对程序进行调试了,在windows中vs直接集成了各种调试工具。在linux中我们需要安装一个额外的调试器,gdb调试器(GNU debugger)是linux下一个c/c++的强大的调试器。其主要功能:

设置断点

单步执行

查看变量

动态改变环境

输入gdb -v可以查看系统中gdb版本,没有则说明未安装gdb。若是系统没有安装gdb调试器,可以输入:sudo yum install gdb 直接在线安装(离线方法较麻烦,不推荐)。

gdb filename 就可以直接进入gdb调试器,注意这里的filename文件在编译是需要-g这样文件才包含有调试信息,-g后面可以接数字1,2,3表示级别,级别越高信息越多ex:-g1 ,-g2。-ggdb是gdb专用的,与-g相同。

gdb常用命令:

filename :装入要调试的可执行文件

run :执行当前调试程序

kill :终止当前调试程序

step :执行一行代码进入函数内部

next :执行一行代码不进入函数内部

break :设置断点

print :打印表达式或变量的值

display :设置自动显示的表达式或变量

list :列出产生执行文件的源代码的一部分

watch :监视变量的值

return :强制函数返回

gdb对程序进行调试的基本过程:gdb filename,进入调试;因为进入调试后直接run的话程序会直接运行退出,这样就无法进行调试了,因此在run之前,需要先设置断点break(同时也可以添加需要显示或监视的变量);这样程序运行到断点处就自动停下来了,这时就可以进行基本的调试,next和step都是向下执行一行代码,区别在于遇到函数的话step会跳转到函数内部执行一行,而next不会;这时可以用print打印出变量的值,之前也可以display设置变量显示,即在调试过程中变量有变化时会自动显示它的值;

断点的设置与删除

介绍常用的几个方法:

break linenumber :在特定行设置断点

break fun :在函数处设置断点

break :没有参数,在下一行设置

break if condition :在特定条件下有断点(停止运行)

clear linenumber :清除所在行号的断点

clear fun :清除函数所在的断点

clear :清除所有断点

delete b_id :清除指定断点编号的断点

enable/disable b_id :使指定断点编号的断点有效/失效

info breakpoints :查看当前设置断点信息(编号,是否有效,位置)

display自动显示变量

display 表达式 :添加自动显示的表达式或变量

info display :查看当前设置信息

delete display number :删除指定编号的display信息

undisplay number :同上

disable/enable display number :使指定编号的display暂时无效/有效

list显示源代码

list :输出当前行前后的源代码

list n: 输出第n行前后的10行代码

list fun :输出函数fun前后的10行代码

list n,m:显示n到m行的代码

list,m:显示当前到m行的代码

show listsize:显示list设置,即默认显示几行,一般为10

set listsize count :设置默认显示行数

其他常用调试命令

whatis 变量或表达式 :显示某个变量或表达式的数据类型

jump 行号:让程序跳到指定行开始调试

print 变量或表达式:打印变量或表达式的值。

print 变量=值:对变量进行赋值。

continue:遇到断点停止后,继续运行

show language:查看当前语言环境.

info source: 查看当前文件语言

until :在执行完循环体内的最后一条语句之后执行 until, 就会执行完循环体

until m:继续运行到m行

finish:执行完当前的函数

set args 参数:指定运行时的参数

show args:查看设置好的参数

线程调试命令

info threads:查看当前进程的线程

thread id:切换调试的线程为指定ID的线程

break file.c:100 thread all:在file.c文件第100行处为所有经过这里的线程设置断点

set scheduler-locking off|on|step:在使用step或者continue命令调试当前被调试线程的时候,其他线程也是同时执行的,off:不锁定任何线程,也就是所有线程都执行,这是默认值。on:只有当前被调试程序会执行。step:在单步的时候,除了next过一个函数的情况以外,只有当前线程会执行

hread apply ID1 ID2 command:让一个或者多个线程执行GDB命令command

thread apply all command:让所有被调试线程执行GDB命令command

set follow-fork-mode child:fork之后调试子进程,父进程不受影响

set follow-fork-mode parent:fork之后继续调试父进程,子进程不受影响

attach pid:附着(attach)到正在运行的进程,pid为进程号

命令简称

在gdb中许多命令都有简写:例如run可以用r代替,下面简要说明:

run :r

next:n

step :s

break :b

delete:d

list:l

print:p

continue:c

info:i

quit:q

gdb调试相关文章参考:

http://www.cnblogs.com/rosesmall/category/371610.html

GDB 常用命令参考手册

使用 GDB 调试多进程程序

gdb调试多线程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux C gcc gdb