g++编译总结
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 |
|
|
输出当前制定变量的值 |
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++编译总结的更多相关文章
- g++编译流程
测试程序test.cpp如下所示: #include <iostream> using namespace std; #define MAX 9 int main() { //just f ...
- [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件
在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...
- 有关g++编译调试的问题
打了个指针版的treap,想用gdb调试,用gcc -g ×××.cpp -o a 时却报错了——直接用gcc编译却不会报错,提示:对‘operator new(unsigned int)’未定义的引 ...
- Linux-编译器gcc/g++编译步骤
gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按 ...
- linux gcc 和 g++ 编译
gcc编译 gcc -o test.out test.c g++ 编译 g++ -o test.out test.cpp
- g++编译cpp文件
gdb调试c程序打不到断点的原因可能是编译c文件的时候没有加-g选项,-g选项是编译加debug信息的,不加是打不到断点的 g++编译cpp文件 g++ -g -c *.cpp 编译 g+ ...
- Linux环境g++编译TinyXML动态库
除了CMarkup,tinyxml也是C/C++下解析XML很好的工具.在linux下用g++编译tinyxml的步骤如下(tinyxml版本2.6.2): 进入tinyxml解压目录,用文本编辑器打 ...
- 学习总结:gcc/g++ 编译与链接
gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处 ...
- Windows Sublime Text 配置Linux子系统(WSL)下的 gcc/g++ 编译环境
0. 简介(若已了解背景可以跳过此部分) Windows 10 Build 14316以上版本中加入了"Windows系统的Linux子系统"(Windows Subsystem ...
随机推荐
- iOS阅读器实践系列(一)coretext纯文本排版基础
前言:之前做了公司阅读类的App,最近有时间来写一下阅读部分的实现过程,供梳理逻辑,计划会写一个系列希望能涉及到尽量多的方面与细节,欢迎大家交流.吐槽.拍砖,共同进步. 阅读的排版用的是coretex ...
- 解析plist文件(字典里包着数组,数组中又包含字典)
#import "RootTableViewController.h" #import "City.h" @interface RootTableViewCon ...
- Spring中配置数据源的4种形式(转)
原文http://blog.csdn.net/orclight/article/details/8616103 不管采用何种持久化技术,都需要定义数据源.Spring中提供了4种不同形式的 ...
- 多线程之NSOperation和NSOperationQueue
这篇文章里我将不过多的谈及理论知识,这些东西会的自然会,不会的,看多了也是云里雾里.下面我讲更多的用代码+注释的方式来讲如何使用NSOperation和NSOperationQueue. 1.NSOp ...
- AFNetworking使用方法
官网下载2.5版本:http://afnetworking.com/ 此文章是基于AFNetworking2.5版本的,需要看AFNetworking2.0版本的请看上一篇文章:AFNetworkin ...
- git不常用命令
1.删除远程分支 git remote origin :分支名 [解释:意思是提交一个空分支到远程分支] ===持续更新
- iOS开发笔记11:表单键盘遮挡、浮点数价格格式化显示、省市区选择器、View Debugging
1.表单键盘遮挡 应用场景为一个collectionView上有多个textfield.textView供用户填写信息. 之前输入项较少时,采取的方法比较粗暴,didSelectItemAtIndex ...
- iOS多线程-01-pthread与NSTread
简介 恰当的使用多线程编程可以提供任务的执行效率和系统资源的利用率 多线程是为了提高资源利用率,和应用程序的响应速度,多个线程共享应用资源 每个应用程序都有一个主线程,通常用来做UI界面刷新等 比较耗 ...
- win8下出现安装sql2012 正在启动操作系统功能"NetFx3"
今天上午装win8系统,发现在装sql server 2012的时候,一直停在"正在启动操作系统功能"NetFx3""不动了,在网上找了下相关的资料,发现原来N ...
- 介绍一种css水平垂直居中的方法(非常好用!)
这次介绍一下一个水平垂直居中的css方法,这个方法可以说是百试百灵,废话不多说,直接附上代码: html,body{ width:100%; height:100%; } 你需要居中的元素{ posi ...