g++的编译及调试

编译重命名等:

g++ –c Hello.cc  编译文件,生成目标文件 Hello.o

g++ Hello.o –o abc  连接 并重命名为可执行文件 abc

g++ Hello.cc    编译连接一起,生成a.out

g++ Hello.cc –o hello 生成a.out并命名为hello


1.总体选项

    -E   
只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里   
面.   
例子用法:   
gcc -E hello.c > pianoapan.txt   
gcc -E hello.c | more   
慢慢看吧,一个hello word 也要与处理成800行的代码      
    -S   
只激活预处理和编译,就是指把文件编译成为汇编代码。   
例子用法   
gcc -S hello.c   
他将生成.s的汇编代码,你可以用文本编辑器察看     
    -c    
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件   
例子用法:   
gcc -c hello.c   
他将生成.o的obj文件  

2.目录选项

    -Idir   
在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头   
文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他   
回先在你所制定的目录查找,然后再按常规的顺序去找.   
对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系   
统的缺省的头文件目录查找    

    -include file

    -i

相当于“#include”
包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以   
用它设定,功能就相当于在代码中使用#include   
例子用法:   
gcc hello.c -include /root/pianopan.h   
    -I-   
就是取消前一个参数的功能,所以一般在-Idir之后使用   
   -idirafter dir   
在-I的目录里面查找失败,讲到这个目录里面查找.   
    -iprefix prefix   
    -iwithprefix dir   

一般一起使用,当-I的目录查找失败,会到prefix+dir下查找    
    -Ldir   
制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然   
编译器将只在标准库的目录找。这个dir就是目录的名称。  
    -llibrary    
制定编译的时候使用的库   
例子用法   
gcc -lcurses hello.c   
使用ncurses库编译程序   

3.调试选项

     -g   
只是编译器,在编译的时候,产生调试信息。   
    -gstabs   
此选项以stabs格式声称调试信息,但是不包括gdb调试信息.   
    -gstabs+   
此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.   
    -ggdb    
此选项将尽可能的生成gdb的可以使用的调试信息.

    -glevel

请求生成调试信息,同时用level指出需要多少信息,默认的level值是2

4.链接方式选项:

    -static 此选项将禁止使用动态库。

优点:程序运行不依赖于其他库

缺点:文件比较大

    -shared (-G) 此选项将尽量使用动态库,为默认选项

优点:生成文件比较小

缺点:运行时需要系统提供动态库

    -symbolic 建立共享目标文件的时候,把引用绑定到全局符号上.

对所有无法解析的引用作出警告(除非用连接编辑选项 `-Xlinker -z -Xlinker defs'取代)。

注:只有部分系统支持该选项.

5.错误与告警选项

    -Wall 一般使用该选项,允许发出GCC能够提供的所有有用的警告。也可以用-W{warning}来标记指定的警告。

    -pedantic 允许发出ANSI/ISO C标准所列出的所有警告

    -pedantic-errors 允许发出ANSI/ISO C标准所列出的错误

    -werror 把所有警告转换为错误,以在警告发生时中止编译过程

    -w 关闭所有警告,建议不要使用此项

6.预处理选项

    -Dmacro   
相当于C语言中的#define macro   
    -Dmacro=defn   
相当于C语言中的#define macro=defn   
    -Umacro   
相当于C语言中的#undef macro   
    -undef   
取消对任何非标准宏的定义 

7.其他选项

    -o

制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈

例子用法   
gcc -o hello.exe hello.c (哦,windows用习惯了)   
gcc -o hello.asm -S hello.c   
    -O0   
    -O1   
    -O2   
    -O3   

编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高

    -fpic 编译器就生成位置无关目标码.适用于共享库(shared library).

    -fPIC 编译器就输出位置无关目标码.适用于动态连接(dynamic linking),即使分支需要大范围转移.

    -v 显示详细的编译、汇编、连接命令
    -pipe   
使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题   
gcc -pipe -o hello.exe hello.c   
    -ansi   
关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏,   
    -fno-asm   
此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。   
    -fno-strict-prototype   
只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型   
    -fthis-is-varialble   
就是向传统c++看齐,可以使用this当一般变量使用.   
    -fcond-mismatch   
允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型   
    -funsigned-char   
    -fno-signed-char   
    -fsigned-char   
    -fno-unsigned-char   

这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前   
两个参数)或者 signed char(后两个参数) 
    -imacros file   
将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中       
    -nostdinc   
使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置   
    -nostdin C++   
规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建libg++库使用   
    -C   
在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的   
    -M   
生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c来测试一下,很简单。   
    -MM   
和上面的那个一样,但是它将忽略由#include造成的依赖关系。   
    -MD   
和-M相同,但是输出将导入到.d的文件里面   
    -MMD   
和-MM相同,但是输出将导入到.d的文件里面   
    -Wa,option   
此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序   
    -Wl.option   
此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序.

    -x language filename   

设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根   
据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果   
你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这   
个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数   
的使用。   
可以使用的参数吗有下面的这些   
`c’, `objective-c’, `c-header’, `c++’, `cpp-output’,    
`assembler’, and `assembler-with-cpp’.   
看到英文,应该可以理解的。   
例子用法:   
gcc -x c hello.pig   
    -x none filename   
关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型   
例子用法:   
gcc -x c hello.pig -x none hello2.c


编译生成执行文件:(mac os)
    bogon:myDir pc$ g++ -g a.cpp -o acpp

使用GDB调试:

hchen/test> gdb tst  <---------- 启动GDB
GNU gdb 5.1.1
Copyright 2002 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-suse-linux"...
(gdb) l     <-------------------- l命令相当于list,从第一行开始例出原码。
1        #include <stdio.h>
2
3        int func(int n)
4        {
5                int sum=0,i;
6                for(i=0; i<n; i++)
7                {
8                        sum+=i;
9                }
10               return sum;
(gdb)       <-------------------- 直接回车表示,重复上一次命令
11       }
12
13
14       main()
15       {
16               int i;
17               long result = 0;
18               for(i=1; i<=100; i++)
19               {
20                       result += i;    
(gdb) break 16    <-------------------- 设置断点,在源程序第16行处。
Breakpoint 1 at 0x8048496: file tst.c, line 16.
(gdb) break func  <-------------------- 设置断点,在函数func()入口处。
Breakpoint 2 at 0x8048456: file tst.c, line 5.
(gdb) info break  <-------------------- 查看断点信息。
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08048496 in main at tst.c:16
2   breakpoint     keep y   0x08048456 in func at tst.c:5
(gdb) r           <--------------------- 运行程序,run命令简写
Starting program: /home/hchen/test/tst

Breakpoint 1, main () at tst.c:17    <---------- 在断点处停住。
17               long result = 0;
(gdb) n          <--------------------- 单条语句执行,next命令简写。
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) n
18               for(i=1; i<=100; i++)
(gdb) n
20                       result += i;
(gdb) c          <--------------------- 继续运行程序,continue命令简写。
Continuing.
result[1-100] = 5050       <----------程序输出。

Breakpoint 2, func (n=250) at tst.c:5
5                int sum=0,i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p i        <--------------------- 打印变量i的值,print命令简写。
$1 = 134513808
(gdb) n
8                        sum+=i;
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$2 = 1
(gdb) n
8                        sum+=i;
(gdb) p i
$3 = 2
(gdb) n
6                for(i=1; i<=n; i++)
(gdb) p sum
$4 = 3
(gdb) bt        <--------------------- 查看函数堆栈。
#0  func (n=250) at tst.c:5
#1  0x080484e4 in main () at tst.c:24
#2  0x400409ed in __libc_start_main () from /lib/libc.so.6
(gdb) finish    <--------------------- 退出函数。
Run till exit from #0  func (n=250) at tst.c:5
0x080484e4 in main () at tst.c:24
24              printf("result[1-250] = %d /n", func(250) );
Value returned is $6 = 31375
(gdb) c     <--------------------- 继续运行。
Continuing.
result[1-250] = 31375    <----------程序输出。

Program exited with code 027. <--------程序退出,调试结束。
(gdb) q     <--------------------- 退出gdb。


使用GDB
————

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数可以做到这一点。如:

    > cc -g hello.c -o hello
    > g++ -g hello.cpp -o hello

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。当你用-g把调试信息加入之后,并成功编译目标代码以后,让我们来看看如何用gdb来调试他。

启动GDB的方法有以下几种:

    1、gdb <program> 
       program也就是你的执行文件,一般在当然目录下。

    2、gdb <program> core
       用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

    3、gdb <program> <PID>
       如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

 

GDB启动时,可以加上一些GDB的启动开关,详细的开关可以用gdb -help查看。我在下面只例举一些比较常用的参数:

    -symbols <file> 
    -s <file> 
    从指定文件中读取符号表。

    -se file 
    从指定文件中读取符号表信息,并把他用在可执行文件中。

    -core <file>
    -c <file> 
    调试时core dump的core文件。

    -directory <directory>
    -d <directory>
    加入一个源文件的搜索路径。默认搜索路径是环境变量中PATH所定义的路径。



  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
g中文编译选项是一种编译器的选项,它提供了一些详细的配置选项,可以帮助开发者优化和定制编译过程。通过使用g中文编译选项,我们可以对编译器的行为进行调整,以提高代码的性能和可靠性。 在下载g中文编译选项时,我们可以从官方网站或者开源软件库进行获取。一般来说,我们可以找到适用于不同操作系统的版本,比如Windows、Mac和Linux。 下载完毕后,我们可以开始详细了解这些编译选项的使用方法。通过查阅相关文档或者使用命令行的帮助选项,我们可以获得关于不同选项的说明和用途。 g中文编译选项提供了许多不同的功能,包括优化选项、调试选项和错误检查选项等。优化选项可以帮助我们提高代码的运行速度和效率,例如通过改变代码的布局和执行顺序来减少指令的执行时间。调试选项可以帮助我们在调试过程中定位错误和问题,例如生成详细的调试信息和符号表。错误检查选项可以帮助我们在编译过程中提前发现并纠正潜在的错误,例如检查未使用的变量和函数。 在使用g中文编译选项时,我们需要根据具体的需求进行选择和配置。根据代码的性质和目标平台的要求,我们可以选择不同的编译选项来获得最佳的性能和可靠性。 总之,g中文编译选项是一种有助于优化和定制编译过程的工具,通过合理地使用这些选项,我们可以提高代码的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值