操作系统:Ubuntu 24.04 .4 LTS
一、编译器和调试器的安装与使用※
1. 安装GCC、GDB※
apt install build-essential gdb2. 安装结果确认※
gcc --version
g++ --version
gdb --version若输出对应版本号,则安装成功。
3. 编译程序※
以下四步实际上用一行即可执行,即:
g++ hello_world.cpp -o hello_world这里拆开仅为了了解编译过程。
(1)预处理※
g++ -E hello_world.cpp -o hello_world.i(2)编译※
g++ -S hello_world.i -o hello_world.s /// 生成汇编语言文件(3)汇编※
g++ -c hello_world.ss -o hello_world.o(4)链接※
g++ hello_world.o -o hello_world4. g++重要编译参数※
| 参数 | 作用 | 示例 |
| -g | 编译带调试信息的可执行文件 | g++ -g hello_world.cpp -o hello_world |
| -O[n] | 优化源代码,n为0~3,常用2 | g++ -O2 hello_world.cpp -o hello_world |
| -l和-L | 指定库文件和指定库文件路径。 -l链接的是/lib、/usr/lib、/usr/local/lib下的库,其他路径的库需要用-L指定路径。 注意:参数后直接接上库路径或者库名,不需要空格,-L指定的是库所在目录,不是库全路径,还需要加上-l才行。 | g++ -L/home/test/folder -lmydll hello_world.cpp |
| -I | 指定头文件搜索目录 | |
| -Wall | 打印警告信息 | g++ -Wall hello_world.cpp |
| -w | 关闭警告信息 | |
| -std=c++11 | 设置编译标准 | g++ -std=c++11 hello_world.cpp |
| -o | 指定输出文件名,不加该参数,会输出a.out | |
| -D | 宏定义 |
Linux下简单测量程序执行时间:
time ./hello_world,即可看见执行程序花费的时间。
多文件编译示例
g++ a.cpp /path/b.cpp xxx -I/includePath
5. GDB调试器※
调试开始:执行gdb [exefilename],进入gdb调试程序,exefilename为要调试的可执行文件名。
Tips:
- 编译程序时需要加
-g才可以用gdb调试:gcc -g main.c -o main。- 按回车键可重复执行上一条命令。
| 命令 | 快捷键 | 作用 |
| $(gdb)help | h | 查看帮助 |
| $(gdb)run | r | 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件) |
| $(gdb)start | 单步执行程序 | |
| $(gdb)list | l | 查看源代码(list-n:从第n行开始查看代码,list+函数名:查看具体函数) |
| $(gdb)set | 设置变量的值 | |
| $(gdb)next | n | 单步调试(逐过程调试,类似Visual Studio的F10) |
| $(gdb)step | s | 单步调试(逐语句调试,类似Visual Studio的F11) |
| $(gdb)backtrace | bt | 查看函数的调用的栈帧和层级关系 |
| $(gdb)frane | f | 切换函数的栈帧 |
| $(gdb)info | i | 查看函数内部局部变量的数值 |
| $(gdb)finish | 结束当前函数,返回函数调用点(类似Visual Studio在函数内部执行:Shift + F11,跳回上级) | |
| $(gdb)continue | c | 继续执行 |
| $(gdb)print | p | 打印值及地址 |
| $(gdb)quit | q | 退出gdb |
| $(gdb)break+num | b | 在第num行设置断点 |
| $(gdb)delete num | d | 取消第num个断点(注意:是断点的编号,不是代码的行数) |
| $(gdb)Info breakpoints | 查看当前设置的所有断点 | |
| $(gdb)display | 追踪查看具体变量数值(类似Visual Studio的添加监视) | |
| $(gdb)undisplay | 取消追踪观察变量 | |
| $(gdb)i watch | 显示观察点 | |
| $(gdb)enable breakpoints | 启用断点 | |
| $(gdb)disable breakpoints | 禁用断点 | |
| $(gdb)x | 查看内存x/20xw显示20个单元,十六进制,每单元四字节 | |
| $(gdb)run argv[1] argv[2] | 调试时命令行传递参数 | |
| $(gdb)set follow-fork-mode child | Makefile项目管理:选择跟踪父子进程 |
二、CMake安装与使用※
apt install cmake1. 语法特性※
- 基本语法格式:
指令(参数1 参数2)- 参数使用括号包起来
- 参数之间使用
空格或分号分隔
指令与大小写无关,但是参数和变量与大小写相关
set(HELLO hello.cpp) add_executable(hello main.cpp hello.cpp) ADD_EXECUTABLE(hello main.cpp ${HELLO})- 变量取值用:
${},在if控制语句中则直接使用变量名:if(HELLO)。
2. 重要指令※
cmake_minimum_required指定CMake的最小版本要求语法:
cmake_minimum_required(VERSION versionNumber [FATAL_ERROR])cmake_minimum_required(VERSION 1.0.0)
project定义工程名称,并且可以指定工程支持的语言语法:
project(projectname [CXX] [C] [Java])project(HELLOWORLD)
set显示定义变量语法:
set(VAR [VALUE] [CACHE TYPE DOCSTRING] [FORCE])set(SRC sayHello.cpp hello.cpp)
include_directories向工程添加多个特定的头文件搜索路径语法:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)include_directories(/usr/lib/mylib ./lib)
link_directories向工程添加多个特定的库文件搜索路径语法:
link_directories(dir1 dir2 …)link_directories(/usr/lib/mylib ./lib)
add_library生成库文件语法:
add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 …)add_library(hello SHARED ${SRC})
add_compile_options添加编译参数语法:
add_compile_options(<option> …)add_compile_options(-Wall -std=c++11 -o2)
add_executable生成可执行文件语法:
add_executable(exename source1 source2 …)add_executable(main main.cpp)
target_link_libraries为target添加需要链接的共享库语法:
target_link_libraries(target library1<debug|optimized> library2…)target_link_libraries(main hello) # 将hello动态库文件链接到可执行文件main
add_subdirectory向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置语法:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL1])add_subdirectory(src)
aux_source_directory发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来自动构件源文件列表语法:
aux_source_directory(dir VARIABLE)aux_source_directory(. SRC) aux_source_directory(main ${SRC})
3. CMake常用变量※
CMAKE_C_FLAGSgcc编译选项CMAKE_CXX_FLAGSg++编译选项CMAKE_BUILD_TYPE编译类型(Debug,Release)
三、VS Code安装必备插件※
- C/C++
- CMake
- CMake Tools
