C++程序的实现(预处理,编译,连接)
Linux平台编译
gcc和g++都是GNU的编译器。
1、对于.c后缀的文件,gcc把它当做是C程序;g++当做是C++程序;
2、对于.cpp后缀的文件,gcc和g++都会当做c++程序。
3、使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL。
test.cpp
  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. cout<<"hello world!"<<endl;
  6. return ;
  7. }
  1. [zsj@localhost aa]$ ldd test
  2. linux-vdso.so. => (0x00007ffff64ac000)
  3. libstdc++.so. => /usr/lib64/libstdc++.so. (0x0000003a67000000)
  4. libm.so. => /lib64/libm.so. (0x0000003a5b000000)
  5. libgcc_s.so. => /lib64/libgcc_s.so. (0x0000003a66000000)
  6. libc.so. => /lib64/libc.so. (0x0000003a5a400000)
  7. /lib64/ld-linux-x86-.so. (0x0000003a59c00000)

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

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

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

3 有汇编变为目标代码(机器代码)生成.o的文件[使用-c参数]
4 连接目标代码,生成可执行程序[使用-o参数]

  1. [zsj@localhost aa]$ g++ -E test.cpp >> test.i
  2. [zsj@localhost aa]$ g++ -S test.i >> test.s
  3. [zsj@localhost aa]$ g++ -c test.s >>test.o
  4. [zsj@localhost aa]$ g++ test.o -o test
  5. [zsj@localhost aa]$ ls
  6. test test.cpp test.i test.o test.s
  7. [zsj@localhost aa]$ ./test
  8. hello world!

注意:如果用gcc编译C++源文件时,加选项:-lstdc++,否则使用了C++操作的文件编译会出错

  1. [zsj@localhost aa]$ gcc test.cpp -o test
  2. /tmp/cceNJsOV.o: In function `main':
  3. test.cpp:(.text+0xa): undefined reference to `std::cout'
  4. 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*)'
  5. 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> >&)'
  6. 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> >&))'
  7. /tmp/cceNJsOV.o: In function `__static_initialization_and_destruction_0(int, int)':
  8. test.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()'
  9. test.cpp:(.text+0x4f): undefined reference to `std::ios_base::Init::~Init()'
  10. /tmp/cceNJsOV.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
  11. collect2: ld 返回
  12.  
  13. [zsj@localhost aa]$ gcc -lstdc++ test.cpp -o test
  14. [zsj@localhost aa]$ ./test
  15. 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 继续程序的运行,直到遇到下一个断点
 print  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 在某处产生一个信号(具体用法后续整理)
 
core文件设置
ulimit -c unlimited 
 
gdb test core 
 

C++基础之C++编译调试的更多相关文章

  1. 【菜鸟玩Linux开发】在Linux中使用VS Code编译调试C++项目

    最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...

  2. 【转载】在Linux中使用VS Code编译调试C++项目

    原文:在Linux中使用VS Code编译调试C++项目 最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS ...

  3. 在Linux中使用VS Code编译调试C++项目

    最近项目需求,需要在Linux下开发C++相关项目,经过一番摸索,简单总结了一下如何通过VS Code进行编译调试的一些注意事项. 关于VS Code在Linux下的安装这里就不提了,不管是CentO ...

  4. 使用VS+VisualGDB编译调试Linux程序

    Linux程序开发变得越来越多,越来越多的程序.产品需要跨平台,甚至有些开源项目只支持Linux平台,所以掌握Linux开发变得越来越重要. 但是对于习惯了Windows下的开发,使用了VS这个宇宙第 ...

  5. 【转载】Windows下VSCode编译调试c/c++

    懒得自己配置或自己配置出现不明问题的朋友可以点这里: [VSCode]Windows下VSCode便携式c/c++环境 http://blog.csdn.net/c_duoduo/article/de ...

  6. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

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

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

  8. 我的前端之旅--SeaJs基础和spm编译工具运用[图文]

    标签:seajs   nodejs   npm   spm   js 1. 概述 本文章来源于本人在项目的实际应用中写下的记录.因初期在安装和使用Seajs和SPM的时候,有点不知所措的经历.为此,我 ...

  9. 亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细)

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip,不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0- ...

随机推荐

  1. HDU3294 Girls' research

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. vmware workstation pro 安装ubantu虚拟机

    参考:https://ywnz.com/linuxaz/3904.html https://www.zhihu.com/search?type=content&q=vmware%20works ...

  3. IIS 高并发导致log记录不完全

    项目测试性能过程中,对于高并发测试过程中发现log记录缺失一部分,经过调查,找到了原因是因为IIS连接数的限制,经过修改连接数,成功完成.设置如下: “点击网站”->“右击切换到功能视图”-&g ...

  4. python-多线程(一)

    一.Python中的线程使用: Python中使用线程有两种方式:函数或者用类来包装线程对象. 1.  函数式:调用thread模块中的start_new_thread()函数来产生新线程.如下例: ...

  5. OpenCv-Python 图像滤波

    均值滤波 均值滤波函数cv2.blur() import cv2 img = cv2.imread('01.jpg') blur = cv2.blur(img,(5,5)) cv2.imshow( ...

  6. 【构建二叉树】02根据中序和后序序列构造二叉树【Construct Binary Tree from Inorder and Postorder Traversal】

    我们都知道,已知中序和后序的序列是可以唯一确定一个二叉树的. 初始化时候二叉树为:================== 中序遍历序列,           ======O=========== 后序遍 ...

  7. FFMPEG实现H264的解码(从源代码角度)

    农历2014年底了,将前段时间工作中研究的FFMPEG解码H264流程在此做一下整理,也算作年终技术总结了! H264解码原理: H264的原理参考另一篇博文 http://blog.csdn.net ...

  8. Java Modifiers

    Private means this could only be seen within this class. Protected means "package private" ...

  9. 标准模板库(STL)学习指南之List链表

    本文转载自天极网,原文地址:http://www.yesky.com/255/1910755.shtml.转载请注明 什么是STL呢?STL就是Standard Template Library,标准 ...

  10. 如何在Windows平台使用VS搭建C++/Lua的开发环境

    转自:http://ju.outofmemory.cn/entry/95358 本文主要介绍如何在Windows平台利用VS搭建C++/Lua开发环境.这里的“C++/Lua开发环境”主要指的是C++ ...