文章目录
Modern C++系列的博客是根据Bonn University的Modern C++课程所作的笔记,兼具笔者个人的实践和思考,谬误之处还请指出。
课程链接
https://www.bilibili.com/video/BV1xZ4y1X7dN
搭建环境
Linux上搭建C++开发环境,最重要的就是vim、 gcc/g++ 和 gdb,其中
-
vim是文本编辑器;
-
gcc(GNU Compiler Collection)顾名思义,即GNU开发的一组适合多平台的编译器的统称,如果要开发C++程序,则需要安装g++;
-
gbd则是功能强大的调试器,可以设置断点使程序停住,监控并修改程序中的变量,跟踪代码的执行过程
安装build-essential
幸运的是,ubuntu提供了一套工具包,涵盖了上述的大部分的工具,直接运行以下命令即可安装:
$ sudo apt-get install build-essential
通过下面的命令,可查看该工具包的依赖:
$ sudo apt-cache depends build-essential
build-essential
|Depends: libc6-dev
Depends: <libc-dev>
libc6-dev
Depends: gcc
Depends: g++
Depends: make
make-guile
Depends: dpkg-dev
运行以下命令查看g++版本:
g++ --version
安装gdb
通过下面的命令安装gdb
sudo apt-get install gdb
查看gdb版本:
$ gdb --version
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
测试
测试vim和g++
我们通过创建一个hello.cpp程序,初步体验Ubuntu上的C++开发。
-
新建
hello.cpp
:$ vim hello.cpp #include<iostream> using namespace std; int main(){ cout<<"hello"<<endl; return 0; }
-
使用g++编译:
$ g++ hello.cpp -o hello.out
或者可以使用
c++
进行编译,这是不同于g++的另一种轻量级编译器Clang
:$ c++ hello.cpp -o hello.out
此时文件夹下会出现高亮显示的
hello.out
文件,表明它是一个可执行文件 -
执行
hello.out
$ ./hello.out hello
补充:Clang
Clang
是另一种较为常用的c++编译器,使用方法如下所示:
$ c++ -std=c++11 -g hello.cpp -o hello.o
测试gdb
上面的例子太简单,我们设置一个稍微复杂的例子:
问题:下面的RevertNum.c
实现了对一个整型数字的反转,例如输入23,输出32,但是输入100时,结果却是010,请使用gdb调试发现问题并修改。
#include <stdio.h>
/*RevertNum.c*/
void ShowRevertNum(int iNum)
{
while (iNum > 10)
{
printf("%d", iNum % 10);
iNum = iNum / 10;
}
printf("%d\n", iNum);
}
int main(void)
{
int iNum;
printf("Please input a number :");
scanf("%d", &iNum);
printf("After revert : ");
ShowRevertNum(iNum);
}
首先,通过下面的命令编译cpp文件,注意一定要加上-g
,打开编译选项!
gcc -g RevertNum.c -o revertnum.out
然后打开gdb开始调试revertnum.out
gdb revertnum.out
这里介绍常见的gdb命令:
Command | meaning |
---|---|
file FILRNAME | 加载out文件 |
list (l) | 查看程序源码,可以加函数名,只显示某个特定的函数,一次只显示10行 |
break (b) | 设置断点,可以加函数名/行号 |
info break (i b) | 查看断点信息 |
next (n) | 单步调试,不进入函数 |
step (s) | 单步调试,进入函数 |
continue (c) | 程序继续运行,到下一断点处暂停 |
display | 可加变量名,显示变量的值 |
quit | 退出gdb调试 |
通过上面的介绍,不难发现问题出在第五行,将 >
改成>=
即可。
更多的GDB调试命令,可以参考博客。
补充
Ubuntu命令
其中,pwd
是print working directory的缩写,/
代表root目录,~
代表home目录。
经典的命令结构${PATH}/command [options] [parameters]
,当然也可以使用占位符(place holder),常见的占位符如下所示:
PlaceHolder | Meaning |
---|---|
* | Any set of characters,任意字符串 |
? | Any single character,任意单个字符 |
[a-f] | 在a,b,c,d,e,f中的任意字符 |
[^a-f] | 不在a,b,c,d,e,f中的任意字符 |
vim命令
gdb命令
google code style sheet
本教程采用了google code style sheet方法,详情见Google C++ Style Guide。
More about c++
更多关于c++的官方说明,可以参考cppreference.com,该网站提供了中文版本。
Reference
[2] GDB 调试命令语句