1.准备工作
环境准备
|
系统架构
|
X86_64
|
| --- | --- |
|
操作系统
|
Ubuntu 18.04及以上版本
须知:
MDC平台工具链仅支持Ubuntu 18.04版本。
|
获取软件包
|
软件包
|
说明
|
| --- | --- |
|
MDC_SDK-{version}.tar.gz
|
MDC二次开发包,包含gcc和clang编译器、编译框架和平台ARXML文件。
|
|
MDC_SDK-{version}_llvm.tar.gz
|
用于安装llvm编译器。
|
|
MDC_AOS_rpmlist-{version}.tar.gz
|
用于在交叉编译环境中安装第三方库。
|
|
MDC_AOS_rpmlist-{version}_llvm.tar.gz
|
用于在安装了llvm的编译环境中安装第三方库。
|
|
MDC-{version}.tar.gz
|
MDC产品包,包含AP平台包,OS镜像,以及MCU、CPLD、BIOS等固件包。
|
2.搭建交叉编译环境
在开发环境中,以普通用户打开终端。
-
进入SDK包(MDC_SDK-{version}.tar.gz)所在目录,并将SDK包解压至指定目录。
执行命令sudo mkdir -p /usr/local,创建目录“/usr/local”。
-
执行命令sudo tar -xf MDC_SDK-{version}.tar.gz -C /usr/local**,将SDK安装包解压至“/usr/local”目录下,解压即安装。
解压得到的“mdc_sdk”目录说明如下:
|
目录
|
说明
|
| --- | --- |
|dp_gea
|
存在GEA系统环境所需交叉编译器gcc、g++等。
|
|manifest
|
存在MDC平台的ARXML文件,Sample等。
|
|env_check.py
|
用于检查Ubuntu、cmake和make版本是否符合要求的脚本。
|
-
确认Ubuntu系统版本为18.04,且已安装满足版本要求的构建/调试工具cmake(3.10.2及以上)和make(4.1及以上)。
在“/usr/local/mdc_sdk”目录下执行校验版本号的脚本命令./env_check.py,回显示例如下,若提示不符合版本要求,请根据要求安装或升级至匹配版本。
<pre class="screen" style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">[INFO]cmake version is OK, the current version is 3.10.2
[INFO]make version is OK, the current version is 4.1
[INFO]Ubuntu version is OK, the current version is Ubuntu 18.04.6 LTS \n \l</pre> -
执行如下命令,配置环境变量。
export PATH=/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/bin:$PATH
-
依次执行如下命令,确认环境变量配置正确。
-
which aarch64-target-linux-gnu-gcc,通过回显确认gcc的安装路径,即步骤4中的安装路径。
<pre class="screen" style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/bin/aarch64-target-linux-gnu-gcc</pre>
-
which aarch64-target-linux-gnu-g++,通过回显确认g++的安装路径,即步骤4中的安装路径。
<pre class="screen" style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/bin/aarch64-target-linux-gnu-g++</pre>
-
3.构建应用
下文以编译helloworld.c文件为例,介绍代码的编译和运行步骤。
- 编写代码,即编辑helloworld.c文件。代码示例如下:
#include <stdio.h>
int main(void)
{
printf("Hello World!\n");
return 0;
}
2.在开发环境中执行命令export CC=aarch64-target-linux-gnu-gcc,指定编译器
3.创建并编写构建文件(Makefile)。
src_file=helloworld.c
elf_file=helloworld
all:
${CC} -I ${SYSROOT}/usr/include -L ${SYSROOT}/usr/lib64 ${src_file} -o ${elf_file}
-
编译helloworld.c文件。
进入helloworld.c文件所在目录,依次执行如下命令:
- export SYSROOT=/usr/local/mdc_sdk/dp_gea/mdc_cross_compiler/sysroot/,指定编译目录。
- make,开始编译。
在“helloworld.c”文件所在目录执行命令ls,若返回结果含有可执行文件(helloworld),表示编译成功。
以SSH连接方式登录MDC系统环境(用户名和密码请参考《调测指南》的“登录操作系统”章节),并在AOS运行环境中运行helloworld。
总结交叉编译脚本,可直接编译cmake工程如下:
(1)build_mdc.sh
rm -rf ./build
mkdir build
cd ./build
cmake -DCMAKE_SYSTEM_PROCESSOR="aarch64" \
-DCMAKE_TOOLCHAIN_FILE=/usr/local/mdc_sdk/dp_gea/toolchain.cmake \
..
make -j8
(2)toolchain.cmake
get_filename_component(TOOLCHAIN_FILE_PATH "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(SCFI_SDK_TYPE dp_gea)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(SCFI_REPO ${TOOLCHAIN_FILE_PATH})
set(SCFI_MDC_SDK ${SCFI_REPO}/mdc_cross_compiler/sysroot/usr)
set(SCFI_USER_SDK ${SCFI_REPO}/user_repo)
set(SCFI_CROSS_COMPILE ${SCFI_REPO}/mdc_cross_compiler/bin)
set(SCFI_MDC_SDK_CMAKE ${SCFI_MDC_SDK}/lib/cmake)
set(SCFI_USER_SDK_CMAKE ${SCFI_USER_SDK}/lib/cmake)
file(RELATIVE_PATH SCFI_REPO_RELATIVE_MDC_CMAKE ${SCFI_MDC_SDK_CMAKE} ${SCFI_REPO})
file(RELATIVE_PATH SCFI_REPO_RELATIVE_USER_CMAKE ${SCFI_USER_SDK_CMAKE} ${SCFI_REPO})
file(RELATIVE_PATH SCFI_MDC_RELATIVE_USER_SDK ${SCFI_USER_SDK} ${SCFI_MDC_SDK})
file(RELATIVE_PATH SCFI_USER_RELATIVE_MDC_SDK ${SCFI_MDC_SDK} ${SCFI_USER_SDK})
set(ara-exec_DIR ${SCFI_MDC_SDK_CMAKE}/exec/)
set(CMAKE_C_COMPILER ${SCFI_CROSS_COMPILE}/aarch64-target-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${SCFI_CROSS_COMPILE}/aarch64-target-linux-gnu-g++)
set(CMAKE_FIND_ROOT_PATH ${SCFI_USER_SDK} ${SCFI_MDC_SDK} ${CMAKE_FIND_ROOT_PATH})
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)