交叉编译

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



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

简单编译示例

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

环境准备

  1. 请准备好支持docker的环境
  2. /storage目录是为实例分配的可读写存储空间,建议数据缓存和日志等存储于该目录,其他目录会随实例启停而及时清理。
  3. /tmp/node_id 为实例分配的设备ID,做为唯一设备标记信息。
  4. 下载并解压编译镜像基础包
  5. 将镜像包解压并导入,分别执行bunzip2 xycloud_cross_arm32_v4.9.4.tar.bz2docker load < xycloud_cross_arm32_v4.9.4.tar
  6. 运行docker启动编译容器,docker run -v ~/go:/go -v ~/project:/work -it --rm xycloud/cross_arm32:v4.9.4 /bin/bash

~/project 需要编译挂载的项目路径,并且挂载到实例內的/project目录下

编译详解

如下示例中,均~/project表示项目所在目录,/usr/local/gogo的目录

简单gcc命令行编译

arm-linux-gnueabihf-gcc --sysroot=${CROSS_ROOT}/${CROSS_TRIPLE}/sysroot helloworld.c -o helloworld

Makefile交叉编译

初始环境变量

#设置环境变量
source env.sh

Automake交叉编译

按如下调整

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

./configure --host=${CROSS_TRIPLE} --build=x86-linux

CMake交叉编译

镜像內已经为CMake提供一个所需要的toolchain文件

CMake命令如下

mkdir -p "cmake/build"
pushd "cmake/build"
cmake -DCMAKE_TOOLCHAIN_FILE={CROSS_ROOT}/Toolchain.cmake ../..
popd

当使用-DCMAKE_TOOLCHAIN_FILE=toolchain-file出现如下错误时,可删除cmake/build目录再重新尝试。

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

    CMAKE_TOOLCHAIN_FILE

Golang交叉编译

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

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

纯Golang项目交叉编译指引

将go所在的目录整个挂载到镜像里即可,执行命令如下

docker run -v /usr/local/go:/usr/local/go -v ~/project:/work -it --rm xycloud/cross_arm32:v4.9.4 /bin/bash

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

export PATH=/usr/local/go/bin:${PATH}
export GOARCH=arm
export GOARM=7
export GOOS=linux
export CGO_ENABLED=0
export CGO_NO_EMULATION=1
## 初始化环境
source env.sh

GRPC环境搭建

  1. GRPC源码挂载到实例里来,执行命令如下
docker run -v /usr/local/src/grpc:/work -d --name build_grpc_env xycloud/cross_arm32:v4.9.4 /bin/bash
docker exec -it build_grpc_env /bin/bash
  1. 进入实例后,在/work目录下执行如下命令,然后等待编译完成
install_grpc.sh
  1. 导出编译编译好的环境成一个新镜像
container_id=$(docker ps -a | grep build_grpc_env | awk '{print $1}')
docker commit ${container_id} xycloud/cross_grpc_arm32:v4.9.4
  1. 编译GRPC项目
docker run -v /usr/local/src/grpc:/work xycloud/cross_grpc_arm32:v4.9.4 /bin/bash
export CROSS_ROOT=${XCC_PREFIX}/${CROSS_TRIPLE}
mkdir -p "examples/cpp/helloworld/cmake/xycloud_build"
pushd "examples/cpp/helloworld/cmake/xycloud_build"
cmake -DCMAKE_TOOLCHAIN_FILE=${CROSS_ROOT}/Toolchain.cmake \
      -DCMAKE_BUILD_TYPE=Release \
      -DProtobuf_DIR=${CROSS_ROOT}/stage/lib/cmake/protobuf \
      -DgRPC_DIR=${CROSS_ROOT}t/stage/lib/cmake/grpc \
      ../..
make
popd