2、开发环境搭建:搭建MTK交叉编译环境、配置Eclipse或VS Code开发环境、下载SDK与源码管理
说实话,很多做MTK开发的朋友,第一步就栽在了环境搭建上。我见过太多人拿着SDK不知道怎么下手,或者编译到一半报错,最后发现是交叉编译器版本不对。嗯,这一章咱们就把这些坑一个个填平。
2.1 交叉编译环境搭建
MTK的芯片跑的是ARM架构,你的电脑是x86架构。说白了,你得在电脑上装一个「翻译官」,把代码翻译成ARM能听懂的语言。这个翻译官就是交叉编译器。
我个人习惯用Linaro GCC,版本选7.5或9.2都行。MTK官方推荐的是arm-linux-gnueabihf- 这个前缀的版本。为什么?因为MTK的Cortex-A系列内核需要硬浮点支持,gnueabihf就是干这个的。
核心步骤:
- 下载Linaro GCC 7.5-2019.12 x86_64_arm-linux-gnueabihf
- 解压到 /opt/toolchains/ 目录
- 配置环境变量 PATH
- 验证安装:arm-linux-gnueabihf-gcc --version
# 下载(我习惯用清华镜像,速度快)
wget https://mirrors.tuna.tsinghua.edu.cn/linaro/.../gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 解压
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/toolchains/
# 配置环境变量(写入 ~/.bashrc)
export PATH=/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
# 生效
source ~/.bashrc
# 验证
arm-linux-gnueabihf-gcc --version
我曾经踩过的坑: 有次我图省事,直接用了Ubuntu apt安装的gcc-arm-linux-gnueabihf。结果编译出来的内核在MT6765上跑起来就死机。查了两天才发现,apt源里的版本是6.3,而MTK的BSP要求至少7.5。所以,千万别偷懒用apt装,老老实实去Linaro官网下载。
2.2 配置Eclipse开发环境
Eclipse虽然老了点,但做嵌入式开发,它的CDT插件确实稳。我个人习惯用Eclipse IDE for Embedded C/C++ Developers,这个版本自带了很多嵌入式工具链支持。
配置要点:
- 安装CDT插件(如果用的是标准版Eclipse)
- 配置交叉编译器路径:Window → Preferences → C/C++ → Build → Environment
- 添加变量:CROSS_COMPILE = arm-linux-gnueabihf-
- 添加变量:CC = arm-linux-gnueabihf-gcc
- 添加变量:LD = arm-linux-gnueabihf-ld
你想想看,每次编译都要手动敲一长串命令,多麻烦。Eclipse里配好了,点一下按钮就编译,省心多了。
小技巧: 在Eclipse里创建一个「External Tools Configurations」,直接调用MTK的make脚本。我一般配两个:一个编译整个工程(make all),一个只编译修改过的文件(make)。这样调试的时候不用每次都全量编译,省时间。
2.3 配置VS Code开发环境
VS Code现在越来越流行了。说实话,我一开始也觉得Eclipse够用了,但后来发现VS Code的插件生态确实好,特别是Remote SSH功能,可以直接在服务器上开发,太方便了。
必备插件清单:
| 插件名 | 用途 | 我的评价 |
|---|---|---|
| C/C++ (ms-vscode.cpptools) | 代码补全、跳转、调试 | 必装,没它不行 |
| Remote - SSH | 远程连接Linux服务器 | 我天天用,强烈推荐 |
| Makefile Tools | 解析Makefile,一键编译 | 比手动敲命令强多了 |
| GitLens | 查看代码历史、谁改了啥 | 排查问题利器 |
| Hex Editor | 查看二进制文件 | 调试固件时用得上 |
VS Code的c_cpp_properties.json配置:
{
"configurations": [
{
"name": "MTK",
"includePath": [
"${workspaceFolder}/**",
"/opt/mtk_sdk/kernel/include",
"/opt/mtk_sdk/bootloader/include"
],
"defines": [
"__KERNEL__",
"CONFIG_ARM"
],
"compilerPath": "/opt/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc",
"cStandard": "gnu11",
"cppStandard": "gnu++14",
"intelliSenseMode": "gcc-arm"
}
],
"version": 4
}
为什么这么配? 我在项目中遇到过一个问题:VS Code的IntelliSense找不到MTK的宏定义,导致一堆红色波浪线。后来发现是没配defines。把__KERNEL__和CONFIG_ARM加上去,世界清净了。
2.4 下载SDK与源码管理
MTK的SDK一般通过两个渠道获取:
- 官方渠道: MTK Online(需要签NDA)
- 芯片代理商: 比如中电港、华强北的一些代理
拿到SDK后,第一件事不是急着编译,而是建立Git仓库。为什么?因为MTK的SDK经常有patch更新,你改过的代码和官方代码混在一起,没有版本管理,后面根本没法维护。
我的源码管理流程:
- 解压SDK到工作目录
- git init 初始化仓库
- git add . 添加所有文件
- git commit -m "Initial import: MTK SDK v1.0"
- 创建分支:git branch my_project
- 切换到自己的分支开发
# 我的标准操作
mkdir mtk_project
cd mtk_project
tar -xvf /path/to/MTK_SDK_v1.0.tar.gz
git init
git add .
git commit -m "feat: import MTK SDK v1.0 baseline"
# 创建自己的开发分支
git checkout -b feature/lte_stack_porting
# 当官方发布patch时
git checkout master
# 解压patch到对应目录
git add .
git commit -m "chore: apply SDK patch v1.1"
git checkout feature/lte_stack_porting
git rebase master
注意: 千万别在master分支上直接改代码。我有个同事就是这么干的,结果官方patch下来,merge冲突搞了三天。用分支管理,出了问题git stash一藏,切回干净分支重新来,多省事。
2.5 验证环境是否搭建成功
环境搭好了,怎么知道对不对?写个最简单的Hello World,交叉编译一下,放到板子上跑。
// hello_mtk.c
#include <stdio.h>
int main() {
printf("Hello from MTK!\n");
printf("Cross compiler: %s\n", __VERSION__);
return 0;
}
# 编译
arm-linux-gnueabihf-gcc -o hello_mtk hello_mtk.c
# 查看文件信息(确认是ARM架构)
file hello_mtk
# 输出应该类似:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)
# 传到板子上运行
adb push hello_mtk /data/
adb shell chmod +x /data/hello_mtk
adb shell /data/hello_mtk
如果看到「Hello from MTK!」和编译器版本号,恭喜你,环境搭建成功了。
一个小建议: 把这个hello_mtk.c文件保存好,以后每次换电脑、重装系统,都先编译一下这个文件。能编译通过,说明交叉环境没问题。我电脑里一直留着这个文件,用了好几年了。
嗯,环境搭建这部分就这些。说白了,就是装个编译器、配个IDE、管理好源码。但就是这些基础工作,做好了能省后面80%的麻烦。下一章咱们开始真正碰MTK的网络协议栈,到时候你就知道环境搭得稳有多重要了。