g++编译&&gdb调试&&coredump调试

一、编译注意细节

1.使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错。

2.gcc/g++ 在执行编译时,需要4步

①   预处理,生成.i的文件[使用-E参数]

②   将预处理后的文件把转换成汇编语言,生成文件.s[使用-S参数]

③   由汇编变为目标代码(机器代码)生成.o的文件[使用-c参数]

④   连接目标代码,生成可执行程序[使用-o参数]

二、gdb调试

1.gdb的调试命令列表.

命令

解释

简写

file

装入想要调试的可执行文件

list

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

l

next

执行一行源代码但不进入函数内部

n

step

执行一行源代码而且进入函数内部

s

run

执行当前被调试的程序

r

continue

继续执行程序

c

quit

终止GDB

q

print

输出当前制定变量的值

p

break

在代码里设置断点

b

info break

查看设置断点的信息

ib

delete

删除设置的断点

d

watch

监视一个变量的值,一旦值有变化,程序停住。

wa

help

GDB的帮助命令

h

使用方法:

在编译程序的时候添加 –g参数,比如:

g++ -g -o hello hello.cpp

在gdb进行调试的使用再输入命令gdb+可执行文件名,比如:

gdb  hello

查看源文件 list 1,回车重复上一次指令

之后就是根据参数列表,按照自己的需求输入自己的命令。

参考网址:

http://blog.csdn.net/wfdtxz/article/details/7368357

如果要产生core文件,可以用gdb [程序名] [core文件名]进入后,输入bt查看堆栈信息。可参考:

http://blog.csdn.net/duanbeibei/article/details/6923716

另外,如果用makefile进行编译的话,要特别注意使用正则表达式,否则编译出的文件将不能用于调试。

比如makefile1:(运行正常)

executemain : main.o commonfun.o mytool.o
g++ -o executemain main.o commonfun.o mytool.o
main.o : main.cpp commonfun.h mytool.h
g++ -g -c main.cpp
common.o : commonfun.h commonfun.cpp
g++ -g -c commonfun.cpp
mytool.o : mytool.h mytool.cpp
g++ -g -c mytool.cpp
clean :
rm -f executemain main.o commonfun.o mytool.o

而makefile2:

COMPILER=g++
executemain : main.o commonfun.o mytool.o
$(COMPILER) -o $@ $^
..c.o :
$(COMPILER) -g -c $<
clean :
rm -f *.o executemain

会提示出如下的错误:

<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /*****/howtousemakefile/executemain...(no debugging symbols found)...done.

三、g++编译选项详解:

其他方面的知识参考如下链接:

编译优化(-O -O2):http://www.cnblogs.com/vv1133/articles/2633669.html 指针优化

代码覆盖(-fprofile-arcs -ftest-coverage):http://blog.chinaunix.net/uid-13182088-id-2904573.html 统计代码信息

-lpthread:http://blog.csdn.net/wangtaoking1/article/details/9822447 线程相关

-lrt:http://blog.csdn.net/wangxvfeng101/article/details/15336955 混合链接

-ldl: http://www.cnblogs.com/xkfz007/archive/2012/04/26/2471771.html 静态链接和动态链接

-luuid: http://blog.csdn.net/yasi_xi/article/details/9297565 唯一识别码

-lm:http://blog.sina.com.cn/s/blog_7905bef10100u0kn.html  math.h函数库libm.so

http://blog.csdn.net/starstarstone/article/details/7493144?utm_source=tuicool

-lcrypt: 与ssl加密有关

-Wl:告诉编译器将后面的参数传递给链接器。

编译静态库或动态库:http://yaycici.blog.163.com/blog/static/173759063201262442532597/

详情见附件:G++编译选项对应表。

附件1:g++编译选项对应表:

gcc/g++

命令的常用选项格式(选项  解释)

-o FILE

指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out.

-c

只编译生成目标文件,不链接

-m486

针对 486 进行代码优化。

-O0

不进行优化处理。

-O 或 -O1

优化生成代码。

-O2

进一步优化。

-O3

比 -O2 更进一步优化,包括 inline 函数。

-w

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

-Wall

允许发出gcc能提供的所有有用的警告,也可以用-W(warning)来标记指定的警告

-werror

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

-MM

输出一个make兼容的相关列表

-v

显示在编译过程的每一步中用到的命令

-E

只运行 C 预编译器。

-shared

生成共享目标文件。通常用在建立共享库时。

-static

链接静态库,即执行静态链接

-lFOO

链接名为libFOO的函数库

-g

在可执行程序中包含标准调试信息

-ggdb

在可执行程序中包含只有GNU debugger才能使别的达两条是信息

-O

优化编译过的代码

-ON

指定代码优化的级别为N,o<=N<=3

-ansi

支持ANSI/ISO C的标准语法,取消GNU的语法扩展中与该标准有冲突的部分(但这一选项并不能保证生成ANSI兼容的代码) 这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。

-pedantic

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

-errors

允许发出ANSI/ISO C标准所列出的所有错误

-traditional

支持Kernighan & Ritchie C语法(如用旧式语法定义函数);如果不知道这个选项的含义,也没有关系

-IDIRECTORY

指定额外的头文件搜索路径DIRECTORY。

-LDIRECTORY

指定额外的函数库搜索路径DIRECTORY。

-DFOO=BAR

在命令行定义预处理宏FOO,其值为BAR

-IDIRNAME

将DIRNAME加入到头文件的搜索目录列表中

-LDIRNAME

将DIRNAME加入到库文件的搜索目录列表中,缺省情况下gcc 只链接共享库

-DMACRO

以字符串“1”定义 MACRO 宏。

-DMACRO=DEFN

以字符串“DEFN”定义 MACRO 宏。

-UMACRO

取消对 MACRO 宏的定义。

g++编译总结的更多相关文章

  1. g++编译流程

    测试程序test.cpp如下所示: #include <iostream> using namespace std; #define MAX 9 int main() { //just f ...

  2. [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件

    在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...

  3. 有关g++编译调试的问题

    打了个指针版的treap,想用gdb调试,用gcc -g ×××.cpp -o a 时却报错了——直接用gcc编译却不会报错,提示:对‘operator new(unsigned int)’未定义的引 ...

  4. Linux-编译器gcc/g++编译步骤

    gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...

  5. linux gcc 和 g++ 编译

    gcc编译 gcc -o test.out test.c g++ 编译 g++ -o test.out test.cpp

  6. g++编译cpp文件

    gdb调试c程序打不到断点的原因可能是编译c文件的时候没有加-g选项,-g选项是编译加debug信息的,不加是打不到断点的 g++编译cpp文件 g++ -g -c *.cpp       编译 g+ ...

  7. Linux环境g++编译TinyXML动态库

    除了CMarkup,tinyxml也是C/C++下解析XML很好的工具.在linux下用g++编译tinyxml的步骤如下(tinyxml版本2.6.2): 进入tinyxml解压目录,用文本编辑器打 ...

  8. 学习总结:gcc/g++ 编译与链接

    gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...

  9. Windows Sublime Text 配置Linux子系统(WSL)下的 gcc/g++ 编译环境

    0. 简介(若已了解背景可以跳过此部分) Windows 10 Build 14316以上版本中加入了"Windows系统的Linux子系统"(Windows Subsystem ...

随机推荐

  1. 深入理解Android的startservice和bindservice

    一.首先,让我们确认下什么是service?         service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级比 ...

  2. MJExtension简介

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. Cocos2d-X-3.0之后的版本的环境搭建

    由于cocos2d游戏开发引擎更新十分频繁,官方文档同步不够及时和完善.所以不要照着官方文档来照做生成工程. <点击图片就能进入网站> 具体的步骤: 1.获取cocos2d-X的源码v3. ...

  4. android多种布局的列表实现

    最近有一个列表效果,需要一个列表有多种布局,最终效果如下: 这个我也问了同事以及开发群里的朋友,居然都没得到最优的实现方式的回答,看来这种复杂列表的需求还是比较少的,我自己也走了一些弯路,把我几个实现 ...

  5. Asp.net mvc中的Ajax处理

    在Asp.net MVC中的使用Ajax, 可以使用通用的Jquery提供的ajax方法,也可以使用MVC中的AjaxHelper. 这篇文章不对具体如何使用做详细说明,只对于在使用Ajax中的一些需 ...

  6. 一个超复杂的间接递归——C语言初学者代码中的常见错误与瑕疵(6)

    问题: 问题出处见 C语言初学者代码中的常见错误与瑕疵(5) . 在该文的最后,曾提到完成的代码还有进一步改进的余地.本文完成了这个改进.所以本文讨论的并不是初学者代码中的常见错误与瑕疵,而是对我自己 ...

  7. 《SQL Server企业级平台管理实践》读书笔记——SQL Server中关于系统库Tempdb总结

    Tempdb系统数据库是一个全局资源,可供连接到SQL Server实例的所有用户使用. 存储的内容项: 1.用户对象 用户对象由用户显示创建.这些对象可以位于用户会话的作用域中,也可以位于创建对象所 ...

  8. 使用jsonp进行跨域访问

    一.使用场景 当我们请求非本服务器的资源的时候,浏览器会禁止访问,并提示不允许跨域访问.此时我们可以使用jsonp这种请求方式,从其他服务器获取资源.在客户端调用提供jsonp支持的接口,获取json ...

  9. Sping mvc 环境下使用kaptcha 生成验证码

    一.kaptcha 的简介 kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kap ...

  10. Safari5及以下版本不支持Date的横杠字符串格式

    Date构造器有多种方式创建方式 一.new Date() // 当天 var date = new Date() 二.new Date(value) // value 为一个整数 var date ...