转自:https://www.cnblogs.com/bugutian/p/4626247.html
一、编译注意细节
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:(运行正常)
1 2 3 4 5 6 7 8 9 10 |
|
而makefile2:
1 2 3 4 5 6 7 |
|
会提示出如下的错误:
1 2 |
|
三、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 宏的定义。 |
分类: 开发