黄岩网站建设兼职,一键优化清理加速,在手机上自己制作游戏软件,广州越秀区租房子多少钱一个月目录
1、环境搭建
1.1 编译器 GCC#xff0c;调试器 GDB
1.2 CMake
2、G 编译
2.1 编译过程
编译预处理 *.i
编译 *.s
汇编 *.o
链接 bin
2.2 G 参数
-g
-O[n]
-l、-L
-I
-Wall、-w
-o
-D
-fpic
3、GDB 调试器
3.1 调试命令参数
4、CMake
4.1 含义
4.2…目录
1、环境搭建
1.1 编译器 GCC调试器 GDB
1.2 CMake
2、G 编译
2.1 编译过程
编译预处理 *.i
编译 *.s
汇编 *.o
链接 bin
2.2 G 参数
-g
-O[n]
-l、-L
-I
-Wall、-w
-o
-D
-fpic
3、GDB 调试器
3.1 调试命令参数
4、CMake
4.1 含义
4.2 构建树
4.3 常用命令
4.4 构建流程 1、环境搭建
1.1 编译器 GCC调试器 GDB
sudo apt update # 需要更新
sudo apt install build-essential gdb# 确定版本号
gcc --version
g --version
gdb --version
1.2 CMake
sudo apt install cmakecmake --version
2、G 编译
2.1 编译过程
编译预处理 *.i 主要对包含的**头文件#include和宏定义#define, #ifdef ...还有注释**等进行处理 预处理之后停止编译过程生成 *.ii.c 生成的是 .i文件 #include 引入的内容被全部复制到预编译文件中宏定义也会被相应替换处理。 # -E 仅对源文件进行预处理
g -E test.cpp -o test.i 最主要的工作宏命令的替换#include 单纯导入可以导入 cpp、txt 文件等等
编译 *.s 语法错误检查检查无误再翻译成汇编语言 生成的是和 CPU 架构相关的汇编指令不同 CPU 架构采用的汇编指令集不同生成的汇编代码也不一样。 # -S 产生汇编语言文件后停止编译
g -S test.i -o test.s
汇编 *.o g 生成g -c test.s -o test.o 汇编器汇编生成as test.s -o test.o 将汇编代码生成机器可执行的二进制目标代码。 # -c 仅把源代码编译为机器语言的目标代码
g -c test.s -o test.o
链接 bin 核心工作解决模块间各种符号变量、函数相互引用的问题除了使用 test.o 还会将静态动态库链接一同生成可执行文件 符号重定位引用符号对符号在内存中具体地址的引用解决当前编译单元如何访问外部符号的问题。 # -o 产生指定文件名的可执行文件
g test.o -o test
# g test.o test.so test.a 添加 **g --save-temps **参数保存编译过程中生成的所有中间文件。
2.2 G 参数
-g 编译带调试信息的可执行文件 产生能被 GNU 调试器GDB使用的调试信息以调试程序。
-O[n] 优化例如省略从未使用过的变量、直接将常量表达式用结果值代替等等 -O 对源代码进行基本优化如-O2-O3-Onn 常为0–3 -O 减小代码的长度和执行时间等价 -O1 -O0 不做优化 -O1 默认优化 -O2 完成-O1优化之外还进行一些额外的调整工作如指令调整等 -O3 包括循环展开和其他一些与处理特性相关的优化工作。
-l、-L -l : 指定库文件如 -lglog -L : 指定库文件路径如 -L/home/lib 。
-I
指定头文件搜索路径。
-Wall、-w -Wall 打印警告信息 -w 关闭警告信息。
-o
指定输出文件名如 -o test 。
-D
定义预处理宏-DDEBUG 开启或关闭 DEBUG。
-fpic position-independent code是否创建与位置无关的目标可行性文件或共享库 PIC广泛使用于共享库使得同一个库中的代码能够被加载到不同进程的地址空间中。PIC 还用于缺少内存管理单元的计算机系统中使得操作系统能够在单一的地址空间中将不同的运行程序隔离开来 地址无关代码能够在不做修改的情况下被复制到内存中的任意位置。这一点不同于重定位代码因为重定位代码需要经过链接器或加载器的特殊处理才能确定合适的运行时内存地址 cmake: set(CMAKE_POSITION_INDEPENDENT_CODEON)。
3、GDB 调试器
3.1 调试命令参数
$(gdb)help(h) # 查看命令帮助具体命令查询在gdb中输入help 命令$(gdb)run(r) # 重新开始运行文件run-text加载文本文件run-bin加载二进制文件
$(gdb)start # 单步执行运行程序停在第一行执行语句
$(gdb)next(n) # 单步调试逐过程函数直接执行
$(gdb)step(s) # 单步调试逐语句跳入自定义函数内部执行
$(gdb)continue(c) # 继续运行
$(gdb)finish # 结束当前函数返回到函数调用点
$(gdb)quit(q) # 退出gdb$(gdb)list(l) # 查看原代码list-n,从第n行开始查看代码。list 函数名查看具体函数
$(gdb)backtrace(bt) # 查看函数的调用的栈帧和层级关系
$(gdb)info(i) # 查看函数内部局部变量的数值
$(gdb)set # 设置变量的值
$(gdb)display # 追踪查看具体变量值
$(gdb)print(p) # 打印值及地址$(gdb)undisplay # 取消追踪观察变量
$(gdb)watch # 被设置观察点的变量发生修改时打印显示
$(gdb)i watch # 显示观察点$(gdb)info breakpoints # 查看当前设置的所有断点
$(gdb)enable breakpoints # 启用断点
$(gdb)disable breakpoints # 禁用断点
$(gdb)breaknum(b) # 在第num行设置断点
$(gdb)delete breakpoints num(d) # 删除第num个断点$(gdb)x # 查看内存x/20xw 显示20个单元16进制4字节每单元
$(gdb)run argv[1] argv[2] # 调试时命令行传参
$(gdb)frame(f) # 切换函数的栈帧
$(gdb)set follow-fork-mode child # Makefile项目管理选择跟踪父子进程fork()
4、CMake
CMake 始于 1999 年当时开发公司 Kitware 被委托设计一套工具来简化研究人员的日常工作软件。目标很明确提供一组工具可以在不同平台上配置、构建、测试和部署项目。
4.1 含义
CMake 本身是一个工具集由五个可执行的程序组成cmake、ctest、cpack、cmake-gui、ccmake。 cmake用于在构建项目的第一步进行项目的配置、生成和构建项目的主要可执行文件的工作 ctest定义测试、测试套件并设置应该如何执行用于运行和报告测试结果的测试驱动程序 cpack为打包需求提供了 DSL用来生成安装程序和源包的打包程序 cmake-guicmake 的图形界面 ccmake用于图形界面与 cmake-gui 不同的地方在于ccmake是基于控制台terminal的图形界面。 CDash 将项目的测试结果在面板中展示。 CMake timeCMake 运行阶段将处理项目中的 CMakeLists.txt 文件并进行配置 Generation time配置成功后CMake 将生成本地构建工具所需的脚本以执行项目中的后续步骤 Build time调用编译器并在特定的构建目录中构建目标。递归的 CMake time 用来实现平台无关的构建 CTest time运行项目的测试套件以检查目标是否按预期执行。 CDash time 或 report time将测试结果上传到面板 Install time将项目的目标、源文件、可执行文件和库从构建目录安装到安装位置。 CPack time 或 packaging time项目打包 Package install time在系统范围内安装新生成的包。
4.2 构建树
构建的每一个目标都是树形的结构。 4.3 常用命令
cmake_minimum_required - 指定CMake的最小版本要求 语法 cmake_minimum_required(VERSION versionNumber [FATAL_ERROR] project - 定义工程名称并可指定工程支持的语言 语法 project(projectname [CXX] [C] [Java]) set - 显式的定义变量 语法set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) set(SRC sayhello.cpp hello.cpp)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
set( CMAKE_BUILD_TYPE Debug )
include_directories - 向工程添加多个特定的头文件搜索路径 语法 include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) include_directories(/usr/include/myincludefolder ./include)
link_directories - 向工程添加多个特定的库文件搜索路径 语法 link_directories(dir1 dir2 ...) link_directories(/usr/lib/mylibfolder ./lib)
add_library - 生成库文件 语法 add_library(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN) add_library(hello SHARED ${SRC})
add_compile_options - 添加编译参数 语法add_compile_options add_compile_options(-Wall -stdc11 -O2)
add_executable - 生成可执行文件 语法add_executable(exename source1 source2 ... sourceN) target_link_libraries - 为 target 添加需要链接的共享库 语法 target_link_libraries(target library1debug | optimized library2...) add_subdirectory - 向当前工程添加存放源文件的子目录并可以指定中间二进制和目标二进制存放的位置 语法 add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) aux_source_directory - 发现目录下所有源文件并将列表存储在一个变量中被用来自动构建源文件列表 语法 aux_source_directory(dir VARIABLE) target_include_directories( swap_lib PUBLIC ${PROJECT_SOURCE_DIR}/include ) - 链接静态库目录 4.4 构建流程 建立 build 文件夹并进入 build 目录mkdir build cd build 编译上级目录的 CMakeLists.txt 文件生成 Makefile 和 其他文件cmake .. 执行 make 命令生成目标make 流程图如下包括三个基本阶段配置、生成、构建阶段