交叉编译

最近更新时间:2018-05-10 18:00:00



星域云边缘计算基于armv7指令集硬件构建,使用C/C++/Golang等编译型语言在x86环境开发时,需要进行交叉编译。

简单编译示例

简单程序的编译建议修改示例中的makefile,复杂程序可参见编译详解进行手工编译

环境准备

  1. 使用Ubuntu 16.04或更新版本

  2. /storage目录是为实例分配的可读写存储空间,建议数据缓存和日志等存储于该目录,其他目录会随实例启停而及时清理。

  3. 下载并解压交叉编译工具包xycloud-devtools.zip

  4. 进入xycloud-devtools目录,安装依赖包./install-build-deps.sh,并设置环境变量source build-env.sh

C/C++示例

$ cd example/helloc
$ make && make install
$ ls -l install/bin/hello
$ file install/bin/hello

5.选择示例_C_hello

Golang示例

$ make
$ ls -l hello
$ file hello

5.选择示例_golang_hello

编译详解

如下示例中,均设定${TOOL_PATH}为上述xycloud-devtools目录的绝对路径path_to_xycloud_devtools

简单gcc命令行编译

$ export TOOL_PATH=path_to_xycloud_devtools
$ export PATH=${TOOL_PATH}/gcc/bin:$PATH
$ arm-linux-gnueabihf-gcc helloworld.c -o helloworld --sysroot=${TOOL_PATH}/sysroot

下载交叉编译工具包 xycloud-devtools.zip并解压得到xycloud-devtools中的example内包含hellochellocchellogo源码

Makefile交叉编译

在Makefile中添加如下设置

# 指定编译工具
TOOL_PATH = path_to_xycloud_devtools
CROSS_COMPILE = ${TOOL_PATH}/gcc/bin/arm-linux-gnueabihf-
AS = ${CROSS_COMPILE}as
AR = ${CROSS_COMPILE}ar
CC = ${CROSS_COMPILE}gcc
LD = ${CROSS_COMPILE}ld
NM = ${CROSS_COMPILE}nm
RANLIB = ${CROSS_COMPILE}ranlib
SIZE = ${CROSS_COMPILE}size
STRINGS = ${CROSS_COMPILE}strings
STRIP = ${CROSS_COMPILE}strip
# 指定sysroot
CFLAGS = --sysroot=${TOOL_PATH}/sysroot ${CFLAGS}

Automake工具链交叉编译

configure时设置--host和--build参数即可指定交叉编译

$ export TOOL_PATH=path_to_xycloud_devtools
$ export PATH=${TOOL_PATH}/gcc/bin:$PATH
$ ./configure --host=arm-linux-gnueabihf --build=x86-linux

CMake交叉编译

为CMake提供一个交叉编译所需要的toolchain文件

#
# CMake Toolchain file for crosscompiling on ARM
#
set(CMAKE_SYSTEM_NAME Linux)

set(TOOL_PATH "path_to_xycloud_devtools")
set(CMAKE_C_COMPILER "${TOOL_PATH}/gcc/bin/arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "${TOOL_PATH}/gcc/bin/arm-linux-gnueabihf-g++")

set(CMAKE_FIND_ROOT_PATH "${TOOL_PATH}/gcc" CMAKE_FIND_ROOT_PATH)
set(CMAKE_FIND_ROOT_PATH "${TOOL_PATH}/sysroot" 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)

CMake命令如下

cmake -DCMAKE_TOOLCHAIN_FILE=toolchain-file CmakeList.txt

当使用-DCMAKE_TOOLCHAIN_FILE=toolchain-file出现如下错误时,可删除CMakeCache.txt以及CMakeFiles目录再重新尝试。

CMake Warning:
  Manually-specified variables were not used by the project:

    CMAKE_TOOLCHAIN_FILE

Golang交叉编译

Golang官方编译器原生支持armv7交叉编译,如果项目是纯Golang代码,无需特殊准备。

如果项目中(包括项目用到的第三方库)包含C/C++代码,请按照C/C++交叉编译一节来准备环境。

纯Golang项目交叉编译指引

在执行go build之前设置如下环境变量即可

export GOARCH=arm
export GOARM=7
export GOOS=linux

Golang与C/C++混合项目交叉编译指引

在执行go build之前设置如下环境变量即可。其中,path_to_xycloud_devtools需要替换为交叉编译工具链xycloud-devtools目录的绝对路径

export GOARCH=arm
export GOARM=7
export GOOS=linux
export TOOL_PATH=path_to_xycloud_devtools/gcc/bin
export CC="${TOOL_PATH}/arm-linux-gnueabihf-gcc"
export CXX="${TOOL_PATH}/arm-linux-gnueabihf-g++"
export STRIP="${TOOL_PATH}/arm-linux-gnueabihf-strip"
export AS="${TOOL_PATH}/arm-linux-gnueabihf-as"
export CGO_ENABLED=0
export CGO_NO_EMULATION=1