【Linux】C++程序开发与调试 - Go语言中文社区

【Linux】C++程序开发与调试


gcc的基本用法

g++ 与 gcc的关系:
Linux的gcc和g++的区别
用gcc编译C++文件
anyway,还是用g++吧

假设有一个源文件为main.cc

#include <iostream>
int main(int args, char** argv){
    std::cout<<"Hello, world"<<std::endl;
    return 0;
}

1. 预处理

g++ -E hello.cc -o hello.iig++ -E hello.cc -o hello.ii

包括去掉开头程序、宏替换、去掉注释
-E 表示预处理完就结束
源代码共五行
在这里插入图片描述
预处理完
在这里插入图片描述

2. 编译

g++ -S hello.ii

-S 表示停到编译结束。将预处理过程生成的.i后缀的文件转化成汇编文件,里面存储的是相应的汇编代码,这个过程叫做编译。
会生成hello.s

3. 汇编

g++ -c hello.s -o hello.o

将汇编文件中的汇编代码翻译成相应的机器语言,这个过程叫做汇编。.o是GCC生成的目标文件,除非你是做编译器和连接器调试开发的,否则打开这种.o没有任何意义。二进制机器码一般人也读不了。

4. 链接

g++ hello.o -o hello 

完成链接这个过程,它通过链接器ld将运行程序的目标文件和库文件链接在一起,生成最后的可执行文件

将上面的过程一气呵成,可以用

g++ hello.cc -o hello

常用属性

-o:指定输出文件的名称
-g:添加gdb调试选项
-Wall:开启编译器几乎所有常用的警告──强烈建议你始终使用该选项。
-c 生成目标文件不链接

  • 使用C++ 11
g++ -std=c++11 ***

gdb

用GDB调试程序
gdb 调试利器

启动gdb

gdb <program>

program也就是你的执行文件,一般在当前目录下。

  • l:查看源代码
  • b:设置断点,包括行号,函数等
  • r:运行程序
  • c:继续
  • bt:查看堆栈
  • n:单步跟踪,但是不进入函数
  • s:单步跟踪,进入函数
  • until:跳出循环
  • until+行号:到某行
  • finish:运行直到当前函数返回
  • q:退出gdb
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Ethan95/article/details/84800330
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢