首页 > 其他分享 >gcc/g++ 使用技巧

gcc/g++ 使用技巧

时间:2024-11-18 12:43:47浏览次数:3  
标签:gcc 技巧 ++ gdb cpp main 断点 调试

使用技巧

常用选项

1.基本编译选项

  • -o <output_file>
    指定输出文件名(可执行文件或目标文件)。

    g++ -o my_program main.cpp → 生成名为 my_program 的可执行文件
    
  • -c
    只编译源代码为目标文件(不链接)。

    g++ -c main.cpp → 生成 main.o
    
  • -S
    生成汇编代码文件(.s)。

    g++ -S main.cpp → 生成 main.s
    
  • -E
    只运行预处理,不进行编译,输出预处理结果。

    g++ -E main.cpp → 输出预处理后的代码
    

2.标准选择

  • -std=c++11
    指定使用 C++ 标准(如 c++98、c++11、c++14、c++20)。
    g++ -std=c++17 main.cpp
    
  • -pedantic
    启用严格的 ISO C++ 标准兼容性检查。

3.调试

  • -g
    启用调试信息(生成符号表,可用于调试器如 gdb)。
    g++ -g -o my_program main.cpp
    

4.优化

  • -O0
    不进行优化(默认)。
    g++ -O0 -o hello_O0 main.cpp
    ./hello_O0
    
  • -O1
    启用基本优化。
  • -O2
    启用更高的优化级别,注重性能与代码大小的平衡。
  • -O3
    最大优化,可能导致更长的编译时间。
  • -Ofast
    极端优化,不完全遵循标准。

5.警告与错误处理

  • -Wall
    启用大部分常见警告。

  • -Wextra
    启用额外的警告。

    g++ -Wall -Wextra -o hello_warning main.cpp
    # 检查是否有警告
    
  • -Werror
    将所有警告视为错误(强制修复警告)。

  • -Wshadow
    警告变量名遮蔽问题(如局部变量遮蔽全局变量)。

    g++ -Wall -Wextra -o my_program main.cpp
    

6.链接与库

  • -l (library)
    链接指定库(注意:库名不带 lib 前缀和 .so 或 .a 后缀)。
    g++ -o my_program main.cpp -lm → 链接数学库 libm.so
    
  • -L (path)
    指定库搜索路径。
    g++ -L/usr/local/lib -o my_program main.cpp -lmylib
    

7.多线程与并行编译

  • -pthread
    启用 POSIX 线程支持(必要时添加)。
    g++ -pthread main.cpp
    
  • -j (n)
    启用并行编译(用于 make 时)。n 是线程数。

MakeFile

MakeFile:记录一个项目编译流程及规则,找到makefile所在文件夹,命令行输入make,即可编译。

# 变量定义
CXX = g++
CXXFLAGS = -std=c++11 -Wall -O2 -g
LDFLAGS = -pthread

# 可执行文件目标
TARGET = helloworld

# 源文件和目标文件
SRC = helloworld.cpp
OBJ = helloworld.o

# 默认目标
all: $(TARGET)

# 生成目标文件
$(TARGET): $(OBJ)
	$(CXX) $(LDFLAGS) -o $(TARGET) $(OBJ)

# 编译 .cpp 文件为 .o 文件
$(OBJ): $(SRC)
	$(CXX) $(CXXFLAGS) -c $(SRC)

# 清理生成的文件
clean:
	rm -f $(TARGET) $(OBJ)

# 安装
install: $(TARGET)
	# 安装命令,如复制到指定目录
	cp $(TARGET) /usr/local/bin

.PHONY: all clean install

  • $^ :所有依赖对象。
  • $<:表示历来对象的第一个。
  • $@:表示目标对象。

GDB 调试

# gcc -g helloworld.c -o helloworld

以helloworld为例,解释调试命令。

# gdb ./helloworld //启动gdb调试
  • 程序运行
命令/缩写作用示例
run(r)运行程序。(gdb) run arg1
start逐步调试。-
  • 调试控制
命令/缩写作用
step(s)逐行执行程序,每执行一条指令就暂停。
next(n)单步调试,不进入函数:这会逐行执行,但遇到函数调用时不会进入函数体内。
continue(c)让程序继续执行,直到下一个断点或程序结束。
quit(q)退出GDB。
  • 断点,查看信息
命令/缩写作用示例
backtrace(bt)查看函数调用栈,快速定位程序崩溃位置。
break(b)设置断点。1. 按行打断点 => (gdb) break 10
2.按照函数名设置断点 => (gdb) break function
3.指定文件和行号 => (gdb) break hello.cpp:10
4.使用条件断点 => (gdb) break function if x>10
5. 按内存地址设置断点 => (gdb) break *0x87043a0
watch查看变量值及变化。根据变量名称查看变量值变化 => (gdb) watch x
info显示各种信息,如寄存器状态、断点列表。查看所有断点信息 => (gdb) info breakpoints
enable启用断点。根据断点id,启用断点 => (gdb) enable 2
disable禁用断点。根据断电id,禁用断点 => (gdb) disable 2
delete删除断点。根据断点id,删除断点 => (gdb) delete 2
print(p)打印变量值。根据变量名称,打印变量的值 => print x
  • 其他
命令/缩写作用示例
set修改变量的值。(gdb) set x = 10
display跟踪查看一个变量,每次停下显示变量的值。(gdb) display x
undisplay取消跟踪。(gdb) undisplay x
until运行跳至指定行。(gdb) until 10
x/10xw 0xaddress查看内存的内容。从0xaddress开始查看10个字的内容。

多进程调试

父进程(默认):set follow-fork-mode <parent>
子进程:set follow-fork-mode child
设置调试模式:set detach-on-fork <on/off>

  • on:其他进程继续执行。
  • off:其他进程挂起。
    查看调试的进程:info inferios
    切换调试的进程:inferior process_id

多线程调试

查看进程:ps aux|grep process_name
查看线程:ps -aL|grep process_name
查看进程树:pstree -p main_thread_id
调试

  • 查看线程:info threads
  • 切换线程:thread thread_id
    只运行当前线程:set scheduler-locking on
    运行全部线程:set scheduler-locking off
    指定某个线程执行gdb命令:thread apply thread_id cmd
    全部线程执行某个命令:thread apply all cmd

标签:gcc,技巧,++,gdb,cpp,main,断点,调试
From: https://blog.csdn.net/qq_45325459/article/details/143854239

相关文章

  • C++ 编程基础(8)模版 | 8.2、函数模版
    文章目录一、函数模版1、声明与定义2、模版参数3、模板的实例化3.1、隐式实例化3.2、显示实例化4、模版的特化5、注意事项6、总结前言:C++函数模板是一种强大的特性,它允许程序员编写与类型无关的代码。通过使用模板,函数或类可以处理不同的数据类型,而无需重复编写......
  • 【C++】C++11 新特性揭秘:序章
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • 宝宝的C++,小学生C++编程启蒙 书籍等
    1、宝宝的C++(2016-11)2、啊哈编程星球:一本书入门Python和C++(2019年09月)啊哈编程星球啊哈编程星球!编程学习从这开始~3、我的第一本算法书(修订版)--2024.24、聪明的算法(2022.07)--6到12岁小读者量身打造的前沿科学大揭秘系列科普书5、走进GoC的编程世界(......
  • PowerDesigner 12小技巧-pd修改外键命名规则-pd添加外键
    PowerDesigner12小技巧-pd小技巧-pd工具栏不见了-pd修改外键命名规则-pd添加外键1.附加:工具栏不见了调色板(Palette)快捷工具栏不见了PowerDesigner 快捷工具栏palette不见了,怎么重新打开,找回来呢上网搜索了一下”powerdesigner图形工具栏”,找到了找回PowerDesigner工具......
  • HarmonyOS Next 密钥转换技巧:提升加解密灵活性
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、引言在当今数字化安全领域,密钥转......
  • Blender UV展开基本技巧
    添加网格时自动生成UV在添加网格时,这里会提示是否帮你自动生成UV保持勾选,给模型添加材质,可以在UV编辑器中看到自动帮你展开好的UV手动展开UV新建一张贴图将UV编辑器和材质都添加上刚才新建好的那张贴图选中所有网格,按“U”,选择智能全选Blender就会自动帮我们上好贴......
  • C++-------------类和对象
    1.类的定义1.1类定义格式•class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意类定义结束时后⾯分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的⽅法或者成员函数。•为了区分成员变量,⼀般习惯上成员变......
  • C++ stl chrono 学习笔记
    chronosinceC++11库的参考手册(英文)|cppreferencechrono库定义了三种(直到c++20)五种(从c++20开始)主要类型以及实用函数和常用类型:cokckstimepointsdurationscalendardates(sinceC++20)timezoneinformation(sinceC++20)clocks时钟由起点(或历元)和滴答率组成......
  • C++-练习-88
    题目:下列程序中每个try后面都使用两个catch块,以确保nbad_index异常导致方法label_val()被调用。请修改该程序,在每个try块后面只使用一个catch块,并使用RTTI来确保合适时调用label_val()。test.h#ifndefQUEUE_H_#defineQUEUE_H_#include<iostream>usingnamespacestd;......
  • C++时间复杂度讲解
    它约等于算法中基本操作重复执行的次数(循环或递归的次数)不是行数!!!最多为O(5)!!!用乘号连接(在嵌套循环中),时间复杂度用O()表示。(O()只是符号)如:for(int=1;i<=n*10/8;i++){      for(intj=1;j<=n*10/2;k++){             for(intk=1;k<n*10;k++)......