在Ubuntu 20.04上编译创龙T113 SDK,我踩过的那些坑(Python版本、gdbus、awk脚本错误全记录) 在Ubuntu 20.04上编译创龙T113 SDK的深度排坑指南第一次在非官方推荐环境下编译嵌入式SDK的经历往往像一场充满未知的冒险。作为长期从事嵌入式开发的工程师我最近尝试在Ubuntu 20.04系统上编译创龙T113的SDK而非使用官方推荐的创龙定制镜像。这一决定让我意外地踏入了各种编译错误的迷宫但也收获了宝贵的排错经验。本文将详细记录这些坑及其解决方案希望能为同样选择自定义环境的开发者提供参考。1. 环境准备阶段的常见陷阱1.1 Python版本兼容性问题在Ubuntu 20.04上执行./build.sh config命令时遇到的第一个拦路虎就是Python版本不兼容。现代Linux发行版普遍默认使用Python 3而许多嵌入式开发工具链仍然依赖Python 2.x版本。排查步骤首先确认系统Python版本ls -l /usr/bin/python*如果发现默认链接指向Python 3需要手动创建Python 2的符号链接sudo rm -f /usr/bin/python # 移除现有链接 sudo ln -s /usr/bin/python2 /usr/bin/python注意修改系统Python链接可能影响其他依赖Python 3的应用。建议在完成SDK编译后恢复原状。1.2 依赖库的完整安装创龙官方文档通常会列出必要的依赖包但在非官方环境下可能需要补充一些额外组件sudo apt-get install -y build-essential bison flex gettext texinfo \ patch gcc g make cmake libncurses5-dev u-boot-tools \ device-tree-compiler python2.7 python-dev swig验证依赖是否完整检查gcc版本gcc --version确认make工具make -v验证Python环境python --version2. 编译过程中的典型错误与修复2.1 gdbus编译错误处理当编译进行到gdbus组件时可能会遇到以下错误gdbusauth.c:1302:11: error: %s directive argument is null gdbusmessage.c:2702:30: error: %s directive argument is null解决方案定位问题文件find . -name gdbusauth.c find . -name gdbusmessage.c修改源代码中的问题行在gdbusauth.c第1302行附近添加空指针检查if (auth_mechanism ! NULL) { g_string_append_printf (debug, mechanism %s, auth_mechanism); }对gdbusmessage.c进行类似修改2.2 awk脚本语法错误编译过程中可能遇到的另一个典型错误是awk脚本语法问题\# is not a known regexp operator排查与修复定位所有涉及的awk脚本文件find . -name *.awk | xargs grep -l sub(/\\#./,统一修改正则表达式语法# 将 sub(/\#./, ); # 改为 sub(/#./, );需要修改的文件通常包括mkerrnos.awkmkerrcodes.awkmkerrcodes1.awkmkerrcodes2.awkmkstrtable.awk3. 缺失文件的手动补全方案3.1 errnos-sym.h文件缺失处理在buildroot阶段可能会遇到errnos-sym.h文件为空的错误。这是libgpg-error组件编译时的常见问题。解决方案创建errnos-sym.h文件内容如下节选/* Output of mkstrtable.awk. DO NOT EDIT. */ static const char errnos_msgstr[] GPG_ERR_E2BIG\0 GPG_ERR_EACCES\0 /* ... 其他错误代码 ... */ GPG_ERR_EXFULL; static const int errnos_msgidx[] { 0, 14, 29, /* ... 索引值 ... */ 2303, }; static GPG_ERR_INLINE int errnos_msgidxof (int code) { return (0 ? 0 : ((code 0) (code 140)) ? (code - 0) : -1); }将文件放置到正确位置cp errnos-sym.h \ /path/to/T113-i_v1.0/out/t113_i/tlt113-minievm-emmc/longan/buildroot/build/libgpg-error-1.33/src/提示完整文件内容可从开源项目或社区资源中获取确保版权合规。4. 高效排错的方法论4.1 错误信息的精准搜索当遇到编译错误时有效的搜索策略能大幅提高排错效率提取关键错误信息去除路径和行号等环境特定信息保留核心错误描述和代码片段搜索技巧# 示例搜索gdbus错误 error: %s directive argument is null site:csdn.net社区资源利用创龙官方论坛CSDN技术博客GitHub Issues4.2 系统差异的预先检查在非官方推荐环境下编译前建议进行以下检查环境对比清单检查项官方环境自定义环境解决方案内核版本4.9.x5.4.x调整配置或内核模块工具链版本gcc 6.3gcc 9.3指定交叉编译工具链库文件位置/opt//usr/lib/设置LD_LIBRARY_PATHPython版本2.73.8创建符号链接4.3 编译日志的分析技巧掌握编译日志的分析方法能快速定位问题根源关键日志标记error:致命错误必须解决warning:潜在问题可能影响最终结果undefined reference链接阶段问题日志过滤命令# 只显示错误信息 make 21 | grep -i error # 显示错误及上下文 make 21 | grep -A 3 -B 3 -i error编译缓存清理# 彻底清理编译环境 ./build.sh distclean rm -rf out/ .tmp/5. 高级调试技巧与优化建议5.1 并行编译的问题处理使用-j参数进行并行编译时可能遇到隐藏问题# 推荐先测试单线程编译 ./build.sh -j1 # 确认无问题后再尝试并行 ./build.sh -j$(nproc)并行编译常见问题资源竞争导致的随机失败依赖关系未正确声明内存不足引发的段错误5.2 交叉编译工具链的验证确保交叉编译工具链配置正确检查工具链路径echo $CROSS_COMPILE which arm-linux-gnueabihf-gcc验证工具链兼容性arm-linux-gnueabihf-gcc -v arm-linux-gnueabihf-readelf -A /path/to/libc.so5.3 编译缓存的合理利用对于大型SDK合理利用ccache可以显著提升编译速度安装并配置ccachesudo apt install ccache echo export PATH/usr/lib/ccache:$PATH ~/.bashrc检查ccache统计信息ccache -s在build.sh中添加ccache支持export USE_CCACHE1 export CCACHE_DIR/path/to/ccache经过这些系统性的排错和优化最终在Ubuntu 20.04上成功编译了T113 SDK。整个过程虽然充满挑战但解决问题的过程本身就是极好的学习机会。对于嵌入式开发者来说掌握这类环境适配技能往往比单纯按照官方文档操作更能提升技术水平。