C++基础之C++编译调试
C++程序的实现(预处理,编译,连接)
Linux平台编译
gcc和g++都是GNU的编译器。
1、对于.c后缀的文件,gcc把它当做是C程序;g++当做是C++程序;
2、对于.cpp后缀的文件,gcc和g++都会当做c++程序。
3、使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL。
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world!"<<endl;
return ;
}
[zsj@localhost aa]$ ldd test
linux-vdso.so. => (0x00007ffff64ac000)
libstdc++.so. => /usr/lib64/libstdc++.so. (0x0000003a67000000)
libm.so. => /lib64/libm.so. (0x0000003a5b000000)
libgcc_s.so. => /lib64/libgcc_s.so. (0x0000003a66000000)
libc.so. => /lib64/libc.so. (0x0000003a5a400000)
/lib64/ld-linux-x86-.so. (0x0000003a59c00000)
gcc/g++ 在执行编译时,需要4步
1 预处理,生成.i的文件[使用-E参数]
2 将预处理后的文件不转换成汇编语言,生成文件.s[使用-S参数]
4 连接目标代码,生成可执行程序[使用-o参数]
[zsj@localhost aa]$ g++ -E test.cpp >> test.i
[zsj@localhost aa]$ g++ -S test.i >> test.s
[zsj@localhost aa]$ g++ -c test.s >>test.o
[zsj@localhost aa]$ g++ test.o -o test
[zsj@localhost aa]$ ls
test test.cpp test.i test.o test.s
[zsj@localhost aa]$ ./test
hello world!
注意:如果用gcc编译C++源文件时,加选项:-lstdc++,否则使用了C++操作的文件编译会出错
[zsj@localhost aa]$ gcc test.cpp -o test
/tmp/cceNJsOV.o: In function `main':
test.cpp:(.text+0xa): undefined reference to `std::cout'
test.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
test.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
test.cpp:(.text+0x1c): undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))'
/tmp/cceNJsOV.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
test.cpp:(.text+0x4f): undefined reference to `std::ios_base::Init::~Init()'
/tmp/cceNJsOV.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
collect2: ld 返回 [zsj@localhost aa]$ gcc -lstdc++ test.cpp -o test
[zsj@localhost aa]$ ./test
hello world!
g++常用的编译选项
编译选项 | 含义 |
-Wall | 显示所有警告信息(warning all) |
-g | 在编译的时候,产生调试信息(gdb时用) |
-O0 -O1 -O2 -O3 |
编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 |
-Idir | 在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所指定的头文件,如 果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他 会先在你所指定的目录查找,然后再按常规的顺序去找。 |
-Ldir | 指定编译的时候,搜索库的路径。比如你自己的库,能用他指定目录,不然 编译器将只在标准库的目录找。这个dir就是目录的名称。 |
-llibrary | 指定编译的时候使用的库 |
-o | 指定目标名称,缺省的时候,gcc 编译出来的文件是a.out |
-fPIC |
作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 通常和-shared一起,用来编译动态链接库。 g++ -shared -fPIC -o test.so test.cpp |
-D
|
定义宏,例如-DAAA=1,-DBBBB 等价于 #define AAA 1 |
-U |
取消宏定义,例如-UAAA |
gdb
命令 | 命令缩写 | 命令说明 |
list | l | 默认显示10行内容 list <line-number> 显示参数行之前和之后的10行 list <line1,line2> line1为显示起始行,line2为显示结束行 |
file | f | 装入需要调试的程序 |
break | b | break <line-number> 指定行处设置断点 break <function-name> 指定函数前设置断点 break <line-number> if <conditional expression> 使用表达式设置断点 break <filename:line-number> break <filename:function-name> 如果程序由很多源文件构成,可以在各个源文件中设置断点 |
info | i |
info break 显示当前断点信息 info registers 查看寄存器情况 info locals 查看局部变量 |
run | r | 开始运行程序 run <arg1 arg2...> 使用带参数run后,如果再次使用不带参数run,gdb就再次使用前一条run命令的参数,如果修改参数,使用set args命令 使用show args命令可以查看缺省参数列表 |
start | st | 开始执行程序,在main函数的第一条语句前面停下来 |
kill | k | 终止正在调试的程序 |
display | disp | 跟踪查看某个变量,每次停下来都显示它的值 |
step | s | 执行下一条语句,如果该语句为函数调用,则进入函数执行其中的第一条语句 |
next | n | 执行下一条语句,如果该语句为函数调用,不会进入函数内部执行(即不会一步步地调试函数内部语句) |
continue | c | 继续程序的运行,直到遇到下一个断点 |
p | 打印内部变量值print <file::varable-name> print <function::varable-name> 观察全局变量值 print func(argq,arg2,...) 对程序中的函数进行调试 print <expression> 查看表达式的值 print <array-name>查看数组的值 print <第一个内存地址的值@需要查看的内存长度> eg int *array=(int*) malloc(len*sizeof(int));p *array@len 查看连续内存地址值 变量输出格式 p/a i 按照16进制显示变量i的值 p/c i 按照字符格式显示变量i的值 p/f i按照浮点数的格式显示变量的值 p/t i 按照二进制显示变量i的值 |
|
watch | watch <condition> 在程序中设置一个观察点,condition是触发观察点的条件 | |
set | set varname=v 设置变量的值 show convenience查看当前设置的所有环境变量 | |
backtrace | bt | 产看函数调用信息(堆栈) |
frame | f | 查看栈帧 |
singal | singal signum 在某处产生一个信号(具体用法后续整理) |
C++基础之C++编译调试的更多相关文章
- 【菜鸟玩Linux开发】在Linux中使用VS Code编译调试C++项目
最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...
- 【转载】在Linux中使用VS Code编译调试C++项目
原文:在Linux中使用VS Code编译调试C++项目 最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS ...
- 在Linux中使用VS Code编译调试C++项目
最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...
- 使用VS+VisualGDB编译调试Linux程序
Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...
- 【转载】Windows下VSCode编译调试c/c++
懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/de ...
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
- [vim配置]windows下在vim中使用gcc/g++编译调试c/cpp文件
在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么 ...
- 我的前端之旅--SeaJs基础和spm编译工具运用[图文]
标签:seajs nodejs npm spm js 1. 概述 本文章来源于本人在项目的实际应用中写下的记录.因初期在安装和使用Seajs和SPM的时候,有点不知所措的经历.为此,我 ...
- 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...
随机推荐
- DELPHI中四种EXCEL访问技术实现
一.引言 EXCEL在处理中文报表时功能非常强大,EXCEL报表访问也是信息系统开发中的一个重要内容,本文总结以往开发中所用到的几中EXCEL文件访问方法,在实际工作中也得到了很好的验证,本文列举了其 ...
- 关于IDT报错乱码总结
可算是把我折腾坏了.一筹莫展.最后才把这些问题搞好.有些事不知道做以前,怎么都想不到.发现了方法之后,原来也不过这样.我觉得自己记性太差.还是好好写下来吧.写下来顺便会帮我重新再梳理一遍.原先乱码是因 ...
- Mybatis generator配置文件及说明
项目采用sring mvc + mybatis 组合,这里简单介绍下mybatis的应用: 我的IDE是STS(Spring + Tool + Suite), 安装Mybatis Generator插 ...
- 2017-2018-1 20179203 《Linux内核原理与分析》第六周作业
攥写人:李鹏举 学号:20179203 ( 原创作品转载请注明出处) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/US ...
- POJ-1564 dfs
#include"cstring" #include"cstdio" +; int nux[maxn]; int nua[maxn];//解的集合 int t; ...
- BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6371 Solved: 2496[Submit][Statu ...
- bzoj 3727: Final Zadanie 思维题
题目: Description 吉丽YY了一道神题,题面是这样的: "一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行会议,所有人都从原住址沿着最短路径来到i结 ...
- Unity Webplayer installation error- Unity Webplayer update finished, but installed..
https://forum.unity3d.com/threads/unity-webplayer-installation-error-unity-webplayer-update-finished ...
- Windows 任务管理器中的几个内存概念
我们使用的大部分 PC 是基于 Intel 微处理器的 x86 和 x64 架构计算机. 因此, 我们面对的 windows 避免不了和 Intel 架构有些设计上的契合. 比如接下来要说到的内存管理 ...
- 一次spark卡顿分析
在104上面执行,经常会发生卡到了如下一句话: storage.BlockManagerInfo: Added broadcast_8_piece0 当再次卡顿的时候,我直接退出,然后通过yarn看后 ...