是的,即使你在 .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) 检查构建套件配置
- 进入 Qt Creator → [工具] → [选项] → [Kits]
- 选择你的交叉编译套件,检查是否有环境变量强制设置了
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助手提供,问题来源于学员提问




