是的,即使你在 .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助手提供,问题来源于学员提问