Linux gcc,gdb命令及vim配置

时间:2022-07-24 21:46:18

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调试相关文章参考:

  1. http://www.cnblogs.com/rosesmall/category/371610.html
  2. GDB 常用命令参考手册
  3. 使用 GDB 调试多进程程序
  4. gdb调试多线程