ZBLOG

Qt Creator 交叉编译的项目,即使选择 Debug 模式,且 .pro 里加入以下配置: CONFIG(debug, debug|release) { QMAKE_CFLAGS_DEBUG += -g QMAKE_CXXFLAGS_DEBUG += -g CONFIG-=strip } 但生成的 Makefile 文件里还是有以下行: STRIP = /opt/industio/evb3568-qt5.14-host-sdk/bin/aarc...

是的,即使你在 .pro 文件中明确禁用了 strip(通过 CONFIG-=strip),但 Qt Creator 生成的 Makefile 中仍然出现了交叉编译工具链的 STRIP = ...,这通常意味着以下情况:


1. 原因分析

  • Qt 的默认行为:某些 Qt 版本(尤其是交叉编译环境)可能会强制注入工具链的 strip,即使你尝试禁用。
  • SDK 配置覆盖:交叉编译工具链(如 Buildroot/Yocto SDK)可能在底层预设了 STRIP,优先级高于 .pro 文件的配置。
  • Debug/Release 模式混淆:确保你确实在 Debug 模式下构建(检查 Qt Creator 左下角的构建套件选择)。

2. 解决方案

(1) 强制覆盖 STRIP(终极方案)

.pro 文件中直接将 STRIP 替换为空命令:

# 彻底禁用 strip
QMAKE_STRIP = echo Skipping strip   # Linux/macOS
# QMAKE_STRIP = rem                # Windows

(2) 检查构建套件配置

  1. 进入 Qt Creator → [工具] → [选项] → [Kits]
  2. 选择你的交叉编译套件,检查是否有环境变量强制设置了 STRIP

(3) 手动修改 Makefile(临时验证)

生成 Makefile 后,手动删除或注释掉 STRIP= 的行,再执行 make


3. 验证符号表是否保留

编译完成后,通过以下命令确认:

# 检查二进制文件是否包含调试符号
aarch64-buildroot-linux-gnu-readelf -S your_executable | grep debug

# perf/addr2line测试示例
addr2line -e your_executable <内存地址>

如果输出能解析到函数名,则符号表未被裁剪。


4. Perf/Addr2line依赖的额外说明

  • 确保调试信息完整:除了禁止 strip,还需确认编译器参数包含 -g(你的配置已添加)。
  • 共享库问题:如果依赖的动态库被裁剪过,可能仍需重新编译这些库并保留符号。

总结

你的观察是正确的——只要 Makefile 中定义了有效的 STRIP=...,最终二进制文件大概率会被裁剪。通过强制覆盖 QMAKE_STRIP 可彻底解决此问题。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=8030

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?