基于VSCode和CMake进行C/C++开发
开发环境搭建
编译器,调试器安装
- 安装GCC,GDB
1 2 3 |
|
- 安装成功确认
1 2 3 4 5 |
|
CMake安装
安装cmake
1 2 |
|
安装成功确认
1 2 3 |
|
GCC编译器
编译过程
-
预处理-Pre-Processing //.i文件
1 2
# -E 选项指示编译器仅对输入文件进行预处理(对#include, #define做文本替换) g++ -E test.cpp -o test.i //.i文件
-
编译-Compiling // .s文件
1 2 3
# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译 # g++ 产生的汇编语言文件的缺省扩展名是 .s g++ -S test.i -o test.s
-
汇编-Assembling // .o文件
1 2 3
# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码 # 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。 g++ -c test.s -o test.o
-
链接-Linking // bin文件
1 2
# -o 编译选项来为将产生的可执行文件用指定的文件名 g++ test.o -o test
重要编译参数
-
-g编译带调试信息的可执行文件
1 2 3 4
# -g 选项告诉 GCC 产生能被 GNU 调试器GDB使用的调试信息,以调试程序。 # 产生带调试信息的可执行文件test g++ -g test.cpp
-
O[n] 优化源代码
1 2 3 4 5 6 7 8 9 10 11 12
## 所谓优化,例如省略掉代码中从未使用过的变量、直接将常量表达式用结果值代替等等,这些操作会缩减目标文件所包含的代码量,提高最终生成的可执行文件的运行效率。 # -O 选项告诉 g++ 对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。 -O2 选项告诉 g++ 产生尽可能小和尽可能快的代码。 如-O2,-O3,-On(n 常为0–3) # -O 同时减小代码的长度和执行时间,其效果等价于-O1 # -O0 表示不做优化 # -O1 为默认优化 # -O2 除了完成-O1的优化之外,还进行一些额外的调整工作,如指令调整等。 # -O3 则包括循环展开和其他一些与处理特性相关的优化工作。 # 选项将使编译的速度比使用 -O 时慢, 但通常产生的代码执行速度会更快。 # 使用 -O2优化源代码,并输出可执行文件 g++ -O2 test.cpp
-
l 和 -L 指定库文件 | 指定库文件路径
1 2 3 4 5 6 7 8 9 10 11
# -l参数(小写)就是用来指定程序要链接的库,-l参数紧接着就是库名 # 在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接 # 链接glog库 g++ -lglog test.cpp # 如果库文件没放在上面三个目录里,需要使用-L参数(大写)指定库文件所在目录 # -L参数跟着的是库文件所在的目录名 # 链接mytest库,libmytest.so在/home/draymonder/mytestlibfolder目录下 g++ -L/home/draymonder/mytestlibfolder -lmytest test.cpp
-
-I 指定头文件搜索目录
1 2 3 4 |
|
-
-Wall 打印警告信息
1 2
# 打印出gcc提供的警告信息 g++ -Wall test.cpp
-
-w 关闭警告信息
1 2
# 关闭所有警告信息 g++ -w test.cpp
-
-std=c++11 设置编译标准
1 2
# 使用 c++11 标准编译 test.cpp g++ -std=c++11 test.cpp
-
-o 指定输出文件名
1 2 3 4
# 指定即将产生的文件名 # 指定输出可执行文件名为test g++ test.cpp -o test
-
-D 定义宏
1 2 3 4 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
注:使用 man gcc
命令可以查看gcc英文使用手册
g++命令行编译
案例:最初目录结构: 2 directories, 3 files
1 2 3 4 5 6 7 8 9 |
|
直接编译
最简单的编译,并运行
1 2 3 4 |
|
1 2 3 4 |
|
生成库文件并编译
-
链接静态库生成可执行文件①
1 2 3 4 5 6 7 8 9 10 11 12 13
## 进入src目录下 $cd src # 汇编,生成Swap.o文件 g++ Swap.cpp -c -I../include # 生成静态库libSwap.a ar rs libSwap.a Swap.o ## 回到上级目录 $cd .. # 链接,生成可执行文件:staticmain g++ main.cpp -Iinclude -Lsrc -lSwap -o staticmain
-
链接动态库生成可执行文件②
1 2 3 4 5 6 7 8 9 10 11 12 13 14
## 进入src目录下 $cd src # 生成动态库libSwap.so g++ Swap.cpp -I../include -fPIC -shared -o libSwap.so ## 上面命令等价于以下两条命令 # gcc Swap.cpp -I../include -c -fPIC # gcc -shared -o libSwap.so Swap.o ## 回到上级目录 $cd .. # 链接,生成可执行文件:sharemain g++ main.cpp -Iinclude -Lsrc -lSwap -o sharemain
-
编译完成后的目录结构
最终目录结构:2 directories, 8 files
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
运行可执行文件
运行可执行文件①
1 2 |
|
运行可执行文件②
1 2 |
|
GDB调试器
调试开始:执行gdb [exefilename] ,进入gdb调试程序,其中exefilename为要调试的可执行文件名
调试想看代码可以
ctrl+x
后ctrl+a
进入gui模式
常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
Tips:
编译程序时需要加上-g,之后才能用gdb进行调试:
gcc -g main.c -o main
回车键:重复上一命令
CMake实战
- 编写
CMakeLists.txt
make build && cd build && cmake .. && make
简单实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
VSCode
tasks.json
用来做任务编排使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|