交叉编译
最近更新时间:2023-05-24
星域云边缘计算支持armv7、armv8、x86指令集硬件构建,使用C/C++/Golang等编译型语言在x86环境开发时,armv7、armv8则需要进行交叉编译。
简单编译示例
简单程序的编译建议修改常规的makefile进行构建,复杂程序可参见编译详解进行手工编译
环境准备
- 请准备好支持docker的环境
- /storage目录是为实例分配的可读写存储空间,建议数据缓存和日志等存储于该目录,其他目录会随实例启停而及时清理。
- /tmp/node_id 为实例分配的设备ID,做为唯一设备标记信息。
- 下载并解压编译镜像基础包
- 将镜像包解压并导入,分别执行
bunzip2 xycloud_cross_arm32_v4.9.4.tar.bz2
和docker load < xycloud_cross_arm32_v4.9.4.tar
- 运行docker启动编译容器,
docker run -v ~/go:/go -v ~/project:/work -it --rm xycloud/cross_arm32:v4.9.4 /bin/bash
~/project 需要编译挂载的项目路径,并且挂载到实例內的/project目录下
编译详解
如下示例中,均~/project
表示项目所在目录,/usr/local/go
为go
的目录
简单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环境搭建
- 将
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
- 进入实例后,在
/work
目录下执行如下命令,然后等待编译完成
install_grpc.sh
- 导出编译编译好的环境成一个新镜像
container_id=$(docker ps -a | grep build_grpc_env | awk '{print $1}')
docker commit ${container_id} xycloud/cross_grpc_arm32:v4.9.4
- 编译
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