1. 环境准备与依赖安装在Ubuntu 20.04上编译创龙T113 SDK首先要解决的就是环境依赖问题。我刚开始尝试时以为直接按照官方文档操作就行结果踩了不少坑。这里分享下我的完整配置过程。先说说硬件环境我用的是创龙TLT113-MiniEVM_V1.2开发板但操作系统没有使用官方推荐的镜像而是选择了更熟悉的Ubuntu 20.04。这个选择后来证明是个双刃剑——既带来了灵活性也增加了一些兼容性问题。第一步是解压SDK包。创龙的LinuxSDK-v1.2.tar.gz文件解压后会得到一个T113-i_v1.0目录。这里有个小技巧建议把解压路径放在用户主目录下不要放在太深的目录层级里因为后续编译时可能会遇到路径长度限制的问题。依赖安装是最容易出问题的环节。官方手册列出的依赖项可能不够全面我通过反复尝试整理出了完整清单sudo apt-get install -y build-essential bison flex \ python2.7 python-dev swig libncurses5-dev \ libssl-dev u-boot-tools device-tree-compiler \ gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf特别注意python2.7的安装这是个大坑。现代Ubuntu系统默认都是python3但创龙SDK需要python2环境。我试过用python3兼容模式结果各种报错最后还是老老实实装了python2.7。2. Python版本冲突解决方案说到Python版本问题这可能是最常遇到的坑。我第一次运行./build.sh config时就遇到了python: command not found错误。解决方法其实很简单但需要理解背后的原理。先检查系统现有的Python版本ls -l /usr/bin/python*在Ubuntu 20.04上你可能会发现只有python3的链接。这时需要手动创建python2的软链接sudo rm -f /usr/bin/python # 先删除已有链接 sudo ln -s /usr/bin/python2 /usr/bin/python验证链接是否生效python --version这里有个细节要注意有些教程会建议用update-alternatives来管理Python版本但在SDK编译环境下直接创建软链接反而更可靠。我两种方法都试过发现update-alternatives有时会导致脚本找不到python解释器。3. 编译配置与内核选项环境准备好后就可以开始配置了。进入T113-i_v1.0目录先清理之前的编译结果cd T113-i_v1.0/ ./build.sh distclean配置环节很关键它决定了后续编译的组件和功能./build.sh config这里会出现一个交互式菜单需要选择处理器型号T113开发板型号tlt113-minievm-nand显示输出方式根据实际硬件选择编译器类型一般选默认的arm-linux-gnueabihf配置完成后建议先保存一份.config文件备份因为后续如果编译出错需要重新配置时可以直接恢复这个备份不用再从头选择。4. 常见编译错误及解决方法4.1 gdbus编译错误第一次完整编译时我遇到了两个gdbus相关的错误gdbusauth.c:1302:11: error: %s directive argument is null gdbusmessage.c:2702:30: error: %s directive argument is null这两个错误都是因为代码中没有对字符串指针做空值检查。解决方法是在对应行数添加判空逻辑在gdbusauth.c第1302行附近修改if (auth-credentials ! NULL) { g_string_append_printf (debug, credentials%s, auth-credentials); }在gdbusmessage.c第2702行附近修改if (signature_str ! NULL) { g_string_append_printf (debug, %s, signature_str); }4.2 awk脚本语法错误接下来遇到的是awk脚本问题\# is not a known regexp operator这个错误出现在几个.awk文件中包括mkerrnos.awkmkerrcodes.awkmkerrcodes1.awkmkerrcodes2.awkmkstrtable.awk问题在于awk版本差异导致的语法不兼容。解决方法是将所有文件中的sub(/\#./, );修改为sub(/#./, );其实就是去掉反斜杠因为新版本awk中#不需要转义。4.3 缺失头文件问题最棘手的一个错误是errnos-sym.h文件缺失errnos-sym.h: No such file or directory这个文件是libgpg-error编译时需要的但SDK里没有提供。我从其他开源项目中找到了解决方案需要手动创建这个文件首先确定文件存放路径T113-i_v1.0/out/t113_i/tlt113-minievm-emmc/longan/buildroot/build/libgpg-error-1.33/src创建errnos-sym.h文件内容如下篇幅所限完整内容可以参考开源项目的实现/* Output of mkstrtable.awk. DO NOT EDIT. */ static const char errnos_msgstr[] GPG_ERR_E2BIG\0 GPG_ERR_EACCES\0...; static const int errnos_msgidx[] {0, 14, 29,...};保存后重新编译即可通过5. 编译优化与后续工作解决所有错误后完整的编译命令是source ./build/envsetup.sh ./build.sh编译过程视机器性能可能需要1-3小时。有几个优化建议使用make -j$(nproc)参数启用多核编译确保有足够的swap空间至少4GB编译前关闭其他占用资源的程序编译完成后生成的固件位于out目录下主要包括u-boot.binsunxi.dtbrootfs.img这些文件可以通过创龙提供的烧录工具写入开发板。第一次启动时建议连接串口调试观察启动日志确保所有驱动正常加载。
创龙T113 SDK编译实战:从环境搭建到疑难排错
1. 环境准备与依赖安装在Ubuntu 20.04上编译创龙T113 SDK首先要解决的就是环境依赖问题。我刚开始尝试时以为直接按照官方文档操作就行结果踩了不少坑。这里分享下我的完整配置过程。先说说硬件环境我用的是创龙TLT113-MiniEVM_V1.2开发板但操作系统没有使用官方推荐的镜像而是选择了更熟悉的Ubuntu 20.04。这个选择后来证明是个双刃剑——既带来了灵活性也增加了一些兼容性问题。第一步是解压SDK包。创龙的LinuxSDK-v1.2.tar.gz文件解压后会得到一个T113-i_v1.0目录。这里有个小技巧建议把解压路径放在用户主目录下不要放在太深的目录层级里因为后续编译时可能会遇到路径长度限制的问题。依赖安装是最容易出问题的环节。官方手册列出的依赖项可能不够全面我通过反复尝试整理出了完整清单sudo apt-get install -y build-essential bison flex \ python2.7 python-dev swig libncurses5-dev \ libssl-dev u-boot-tools device-tree-compiler \ gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf特别注意python2.7的安装这是个大坑。现代Ubuntu系统默认都是python3但创龙SDK需要python2环境。我试过用python3兼容模式结果各种报错最后还是老老实实装了python2.7。2. Python版本冲突解决方案说到Python版本问题这可能是最常遇到的坑。我第一次运行./build.sh config时就遇到了python: command not found错误。解决方法其实很简单但需要理解背后的原理。先检查系统现有的Python版本ls -l /usr/bin/python*在Ubuntu 20.04上你可能会发现只有python3的链接。这时需要手动创建python2的软链接sudo rm -f /usr/bin/python # 先删除已有链接 sudo ln -s /usr/bin/python2 /usr/bin/python验证链接是否生效python --version这里有个细节要注意有些教程会建议用update-alternatives来管理Python版本但在SDK编译环境下直接创建软链接反而更可靠。我两种方法都试过发现update-alternatives有时会导致脚本找不到python解释器。3. 编译配置与内核选项环境准备好后就可以开始配置了。进入T113-i_v1.0目录先清理之前的编译结果cd T113-i_v1.0/ ./build.sh distclean配置环节很关键它决定了后续编译的组件和功能./build.sh config这里会出现一个交互式菜单需要选择处理器型号T113开发板型号tlt113-minievm-nand显示输出方式根据实际硬件选择编译器类型一般选默认的arm-linux-gnueabihf配置完成后建议先保存一份.config文件备份因为后续如果编译出错需要重新配置时可以直接恢复这个备份不用再从头选择。4. 常见编译错误及解决方法4.1 gdbus编译错误第一次完整编译时我遇到了两个gdbus相关的错误gdbusauth.c:1302:11: error: %s directive argument is null gdbusmessage.c:2702:30: error: %s directive argument is null这两个错误都是因为代码中没有对字符串指针做空值检查。解决方法是在对应行数添加判空逻辑在gdbusauth.c第1302行附近修改if (auth-credentials ! NULL) { g_string_append_printf (debug, credentials%s, auth-credentials); }在gdbusmessage.c第2702行附近修改if (signature_str ! NULL) { g_string_append_printf (debug, %s, signature_str); }4.2 awk脚本语法错误接下来遇到的是awk脚本问题\# is not a known regexp operator这个错误出现在几个.awk文件中包括mkerrnos.awkmkerrcodes.awkmkerrcodes1.awkmkerrcodes2.awkmkstrtable.awk问题在于awk版本差异导致的语法不兼容。解决方法是将所有文件中的sub(/\#./, );修改为sub(/#./, );其实就是去掉反斜杠因为新版本awk中#不需要转义。4.3 缺失头文件问题最棘手的一个错误是errnos-sym.h文件缺失errnos-sym.h: No such file or directory这个文件是libgpg-error编译时需要的但SDK里没有提供。我从其他开源项目中找到了解决方案需要手动创建这个文件首先确定文件存放路径T113-i_v1.0/out/t113_i/tlt113-minievm-emmc/longan/buildroot/build/libgpg-error-1.33/src创建errnos-sym.h文件内容如下篇幅所限完整内容可以参考开源项目的实现/* Output of mkstrtable.awk. DO NOT EDIT. */ static const char errnos_msgstr[] GPG_ERR_E2BIG\0 GPG_ERR_EACCES\0...; static const int errnos_msgidx[] {0, 14, 29,...};保存后重新编译即可通过5. 编译优化与后续工作解决所有错误后完整的编译命令是source ./build/envsetup.sh ./build.sh编译过程视机器性能可能需要1-3小时。有几个优化建议使用make -j$(nproc)参数启用多核编译确保有足够的swap空间至少4GB编译前关闭其他占用资源的程序编译完成后生成的固件位于out目录下主要包括u-boot.binsunxi.dtbrootfs.img这些文件可以通过创龙提供的烧录工具写入开发板。第一次启动时建议连接串口调试观察启动日志确保所有驱动正常加载。