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)