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