Linux--gcc,g++区别;gdb调试

本文详细解析了GCC和G++编译器的主要区别,包括如何正确编译C++代码,以及使用GDB进行debug版本的创建、断点设置、运行管理和变量值显示等调试方法。

gcc,g++区别

误区:gcc编译c语言,g++编译c++
区别1:gcc编译c++代码需要加-lstdc++,gcc默认只链接c库,并不会链接c++库,需要手工指定
g++默认链接c库和c++标准库

区别2:gcc如果编译c语言文件,用c语言方式编译,编译c++用c++方式编译,g++不管编译c还是c++都用c++标方式编译

可执行文件的两种版本
1.debug版本,调试版本,编译阶段会加入某些调试信息
编译时,加入-g选项,可生成debug版本
2.release版本,发行版本,没有调试信息
gcc默认生成release版本

调试方法:

gdb debug版本可执行文件
显示源码:l(list)(默认显示main函数所在文件的源码)
list filename:行号

断点管理
添加断点:1.b 行号 给指定行添加断点
2.b 函数名 给指定函数实现第一行添加一个断点
3.b filename 行号 给指定文件的行号添加一个断点

查看断点信息:info b
删除断点:d 断点号

运行管理
r 启动执行,程序执行到逻辑上的第一个断点处
n 逐过程
s 逐语句
finish 跳出函数
c 继续执行,直到下一个断点
u 退出循环
q 退出调试

显示变量的值
p 变量名 输入一次,执行一次
display 变量名 执行过程中,每执行一步,显示一次
info display 显示所有display信息
undisplay display编号 取消一个display

p &valname 显示变量地址
p ptr 显示ptr中存储的值,指向变量的地址
p *ptr 显示ptr指针指向的变量的值
p arr 显示数组所有元素
p arr 在形参中退化为指针 p *arr@数组大小 显示数组所有元素

对于结构体变量
p node 显示结构体变量中所有成员的值
p node.a 显示node中a成员的值
p node->a

如果测试一个有返回值的函数能否正常执行
p 函数名(传递的实参)显示函数执行结果
bt 显示函数调用栈

<think>我们正在配置Qt Kits,选择编译器为/usr/bin/arm-linux-gnueabihf-g++gcc(这里gcc应该是指同目录下的arm-linux-gnueabihf-gcc),调试器为/usr/bin/gdb-multiarch,Qt版本为/opt/linux-qt/linux-lubancat-g++/bin/qmake。配置后出现红色警告,我们需要分析原因。 红色警告通常表示配置存在问题,可能的原因包括: 1. **编译器与Qt版本不匹配**:交叉编译的Qt库需要与交叉编译器匹配。如果Qt库是用其他编译器编译的,则可能导致不兼容。 2. **调试器不支持目标架构**:虽然gdb-multiarch支持多架构,但可能没有正确配置或缺少对arm架构的支持。 3. **Qt版本配置问题**:指定的qmake路径可能不正确,或者该Qt版本没有正确安装。 4. **系统缺少依赖库**:编译器或调试器运行时可能缺少必要的库。 5. **环境变量问题**:可能需要在Qt Creator中设置额外的环境变量。 根据引用内容,我们可以逐步排查: 引用[1]展示了如何设置环境变量并验证交叉编译器(arm-linux-gnueabihf-gcc)的版本。这说明我们需要确保交叉编译器在系统中可用且环境变量设置正确。 引用[2]提到在安装g++-arm-linux-gnueabihf时可以选择gcc版本,因此我们应确保安装的交叉编译器版本与编译Qt库时使用的版本一致。 引用[3]和[4]强调在编译程序时需要加上`-g`选项才能使用gdb调试,因此我们需要检查Qt项目构建时是否生成了调试信息。 引用[5]列出了一些gcc选项,包括`-static`、`-shared`、`-g`等,这些选项会影响程序的链接方式和调试信息的生成。 具体排查步骤: 1. **验证交叉编译器是否可用**: 在终端中执行: ```bash /usr/bin/arm-linux-gnueabihf-gcc --version ``` 确保输出正确的版本信息。 2. **验证qmake是否可用**: 在终端中执行: ```bash /opt/linux-qt/linux-lubancat-g++/bin/qmake --version ``` 查看输出的Qt版本和编译器信息,确认其是否是为arm架构交叉编译的。 3. **验证调试器是否支持arm架构**: 在终端中执行: ```bash gdb-multiarch --version ``` 然后启动gdb-multiarch,尝试设置目标架构: ```bash gdb-multiarch (gdb) set architecture arm ``` 如果没有报错,说明支持arm架构。 4. **检查Qt Creator中的配置**: - 在Qt Creator的Kits配置页面,检查编译器路径是否正确指向arm-linux-gnueabihf-g++和arm-linux-gnueabihf-gcc(注意:这里不能使用系统自带的gcc,必须是交叉编译器)。 - 检查调试器路径是否为/usr/bin/gdb-multiarch。 - 检查Qt版本是否选择了交叉编译得到的qmake。 5. **检查构建套件(Kit)的兼容性**: - 在Qt Creator中,选择该Kit后,尝试配置一个简单的Qt项目(例如Hello World),看是否能成功编译和运行(在设备上运行)。 - 注意:在构建项目时,确保在.pro文件中添加了调试信息选项,例如: ```qmake QMAKE_CXXFLAGS += -g ``` 6. **查看红色警告的具体内容**: - 将鼠标悬停在红色警告上,查看详细错误信息。这可能是最直接的线索。 常见错误原因: - **编译器不匹配**:交叉编译的Qt库需要使用特定版本的交叉编译器,如果不一致,则会出现警告。例如,Qt库可能是用gcc 5编译的,而当前交叉编译器是gcc 11。 - **qmake配置错误**:交叉编译的Qt库可能需要设置sysroot等参数,而Qt Creator中未设置。 - **调试器配置问题**:虽然gdb-multiarch支持多架构,但可能缺少arm的调试支持,需要安装相关插件。 - **缺少依赖库**:运行gdb-multiarch可能需要32位库(如果主机是64位系统),参考之前的解决方案: ```bash sudo apt install libncursesw5:i386 libstdc++6:i386 ``` 根据引用[1]和[2],我们还要注意交叉编译器的版本问题。如果Qt库是用旧版本交叉编译器编译的,而当前使用新版本,可能会导致ABI不兼容。 总结解决方案: 1. 检查红色警告的具体信息,根据提示解决问题。 2. 确保交叉编译器、Qt库、调试器的版本兼容。 3. 确保调试gdb-multiarch支持arm架构,并安装必要的32位库。 4. 在Qt项目构建时添加`-g`选项以生成调试信息。 如果上述步骤无法解决,可能需要重新编译Qt库,确保使用当前系统中的交叉编译器进行编译。 相关问题: 1. 如何检查和设置Qt构建套件的兼容性? 2. 如何为交叉编译的Qt项目配置调试信息? 3. 如何解决交叉编译器版本不匹配的问题? 4. 如何验证gdb-multiarch对特定架构的支持? 5. 如何在Qt Creator中设置sysroot以便交叉编译? </think>根据您描述的配置情况,Qt Kits出现红色警告的原因可能有以下几点,结合引用内容和交叉编译经验分析如下: ### 🔴 红色警告的主要原因分析 #### 1. **编译器与Qt版本不匹配**(最常见原因) - 交叉编译的Qt库(`/opt/linux-qt/linux-lubancat-g++/bin/qmake`)必须使用与目标架构完全一致的编译器编译生成 - **验证命令**: ```bash # 检查Qt库编译时的架构 /opt/linux-qt/linux-lubancat-g++/bin/qmake -query QT_ARCH # 检查编译器的目标架构 /usr/bin/arm-linux-gnueabihf-g++ -dumpmachine ``` - **不匹配表现**:若输出结果不一致(如Qt库为 `armv7l` 而编译器为 `armv8-a`),会导致二进制格式不兼容[^2][^5] #### 2. **调试器架构支持问题** - `gdb-multiarch` 虽支持多架构,但需明确指定目标架构 - **解决方案**: ```bash # 创建gdb包装脚本 echo -e '#!/bin/sh\nexec gdb-multiarch -ex "set architecture arm" "$@"' | sudo tee /usr/bin/arm-gdb sudo chmod +x /usr/bin/arm-gdb ``` 在Qt Creator中改用此脚本路径 `/usr/bin/arm-gdb`[^1][^3] #### 3. **Qt库配置不完整** - 交叉编译的Qt库需包含调试信息(引用[3]强调 `-g` 选项的重要性) - **验证步骤**: ```bash # 检查Qt库是否包含调试符号 readelf -S /opt/linux-qt/linux-lubancat-g++/lib/libQt5Core.so.5 | grep debug ``` - **缺失表现**:若无 `.debug_info` 段输出,说明缺少调试信息 #### 4. **系统库路径缺失** - 交叉编译环境需要正确设置库搜索路径(引用[5]提及静态库安装) - **关键路径配置**: ```bash # 在Qt Creator的构建环境变量中添加 export LIBRARY_PATH=/usr/arm-linux-gnueabihf/lib:$LIBRARY_PATH export LD_LIBRARY_PATH=/usr/arm-linux-gnueabihf/lib:$LD_LIBRARY_PATH ``` #### 5. **32/64位兼容性问题** - 主机系统缺少32位支持库(常见于64位Ubuntu) - **修复命令**: ```bash sudo apt install libc6:i386 libstdc++6:i386 ``` ### 🛠 诊断流程建议 1. **检查Qt版本编译日志** ```bash cat /opt/linux-qt/linux-lubancat-g++/config.log | grep "Target architecture" ``` 2. **验证工具链完整性** ```bash # 编译器验证 /usr/bin/arm-linux-gnueabihf-g++ -v # 调试器验证 gdb-multiarch --config | grep arm ``` 3. **创建最小测试项目** ```bash echo -e '#include <QCoreApplication>\nint main() { return 0; }' > test.cpp /opt/linux-qt/linux-lubancat-g++/bin/qmake -project /opt/linux-qt/linux-lubancat-g++/bin/qmake make file test # 检查输出架构 ``` ### 📌 配置建议 1. **统一工具链来源**:使用相同来源的编译器/Qt库(如都来自Linaro或都来自APT) 2. **显式指定sysroot**:在Qt Creator的Kit设置中添加: ``` SYSROOT=/path/to/target-sysroot ``` 3. **使用gdb wrapper脚本**(如前文所述) ### 相关问题 1. 如何验证交叉编译Qt库与编译器架构的兼容性? 2. `gdb-multiarch`不支持特定ARM架构时如何解决? 3. 交叉编译Qt项目时出现`GLIBCXX not found`错误如何修复? 4. 如何为嵌入式设备配置Qt Creator的远程调试环境? 5. 制作交叉编译Qt库时如何确保包含调试符号信息?[^3][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值