安装交叉编译工具链
还是我太天真了,还是要安装gcc的交叉编译器的。 切切实实的感受到了it界的万物基于c
# 安装各个架构交叉编译工具
apt install -y build-essential gcc-arm-linux-gnueabihf gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 gcc-aarch64-linux-gnu gcc-mips-linux-gnu gcc-mips64-linux-gnuabi64 gcc-mips64el-linux-gnuabi64 gcc-mipsel-linux-gnu
尽力了,只解决到这里,arm64的windows、Macos交叉编译没找到工具,脚本中已经提了出来,后面再看看吧
压缩
对我的工程代码量来说编译的文件有点大,想办法压缩下
- upx压缩
# 安装程序 apt install upx-ucl # 压缩 upx 二进制文件
- strip压缩
strip 二进制文件
- 静态库编译
不推荐,我觉得这样失去了go程序的意义了,脚本里面也没加相关控制
go build -ldflags="-s -w"
新的脚本
#!/bin/bash
#编译开始时间
cmp_start_time=$(TZ="Asia/Shanghai" date +%Y年%m月%d日-%H时%M分%S秒)
# 编译出的文件名前缀
app_name="app"
# 编译入口文件,go项目创建了mod文件可以为空
run_file=""
#输出路径
out_path="out/"
# 设置go lib仓库镜像代理
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct
# CGO不支持交叉编译,关闭
export CGO_ENABLED=1
# git Tag信息,非git目录则为空
tag_info=""
if [[ $(git rev-parse --is-inside-work-tree) == true ]];then
tag_info=-$(git describe --abbrev=0 --tags)
fi
# 编译的平台
targets=(
"linux/amd64/x86_64-linux-gnu-gcc/"
"linux/arm/arm-linux-gnueabihf-gcc/"
"linux/arm64/aarch64-linux-gnu-gcc/"
"linux/mips/mips-linux-gnu-gcc/"
"linux/mipsle/mipsel-linux-gnu-gcc/"
"linux/mips64/mips64-linux-gnuabi64-gcc/"
"linux/mips64le/mips64el-linux-gnuabi64-gcc/"
"windows/amd64/x86_64-w64-mingw32-gcc/.exe"
"windows/386/i686-w64-mingw32-gcc/.exe"
)
# 目前编译不过且无法处理的
filed_arch=(
"windows/arm64/aarch64-linux-gnu-gcc/.exe"
"darwin/amd64/x86_64-w64-mingw32-gcc/.dmg"
"darwin/arm64/aarch64-linux-gnu-gcc/.dmg"
)
# 记录构建失败的次数
falied_count=0
# 循环构建
for target in "${targets[@]}"; do
export GOOS="$(echo $target | cut -d'/' -f1)"
export GOARCH="$(echo $target | cut -d'/' -f2)"
export CC="$(echo $target | cut -d'/' -f3)"
suffix="$(echo $target | cut -d'/' -f4)"
echo ""
echo ${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix}构建中......
go build -o ${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix} ${run_file}
if [[ ! -f ${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix} ]];then
falied_count=$((falied_count+1))
echo 构建失败:${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix}
else
echo 构建完成:${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix}
fi
done
# 输出编译时间情况
echo 开始编译时间:${cmp_start_time}
echo 编译结束时间:$(TZ="Asia/Shanghai" date +%Y年%m月%d日-%H时%M分%S秒)
exit $falied_count#!/bin/bash
#编译开始时间
cmp_start_time=$(TZ="Asia/Shanghai" date +%Y年%m月%d日-%H时%M分%S秒)
# 编译出的文件名前缀
app_name="app"
# 编译入口文件,go项目创建了mod文件可以为空
run_file=""
#输出路径
out_path="out/"
# 压缩模式开关
upx_on=1
strip_on=1
# 设置go lib仓库镜像代理
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct
# CGO不支持交叉编译,关闭
export CGO_ENABLED=1
# git Tag信息,非git目录则为空
tag_info=""
if [[ $(git rev-parse --is-inside-work-tree) == true ]];then
tag_info=-$(git describe --abbrev=0 --tags)
fi
# 编译的平台
targets=(
"linux/amd64/x86_64-linux-gnu-gcc/"
"linux/arm/arm-linux-gnueabihf-gcc/"
"linux/arm64/aarch64-linux-gnu-gcc/"
"linux/mips/mips-linux-gnu-gcc/"
"linux/mipsle/mipsel-linux-gnu-gcc/"
"linux/mips64/mips64-linux-gnuabi64-gcc/"
"linux/mips64le/mips64el-linux-gnuabi64-gcc/"
"windows/amd64/x86_64-w64-mingw32-gcc/.exe"
"windows/386/i686-w64-mingw32-gcc/.exe"
)
# 目前编译不过且无法处理的
filed_arch=(
"windows/arm64/aarch64-linux-gnu-gcc/.exe"
"darwin/amd64/x86_64-w64-mingw32-gcc/.dmg"
"darwin/arm64/aarch64-linux-gnu-gcc/.dmg"
)
# 记录构建失败的次数
falied_count=0
# 循环构建
for target in "${targets[@]}"; do
export GOOS="$(echo $target | cut -d'/' -f1)"
export GOARCH="$(echo $target | cut -d'/' -f2)"
export CC="$(echo $target | cut -d'/' -f3)"
suffix="$(echo $target | cut -d'/' -f4)"
echo ""
go build -o ${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix} ${run_file}
if [[ ! -f ${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix} ]];then
falied_count=$((falied_count+1))
echo 构建失败:${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix}
else
if [[ ${upx_on} == 1 ]];then
echo 对文件UPX压缩中......
upx ${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix}
echo UPX压缩完成
fi
if [[ ${strip_on} == 1 ]];then
echo 对文件strip压缩中......
strip ${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix}
echo strip压缩完成
fi
echo 构建完成:${out_path}${app_name}-${GOOS}-${GOARCH}${tag_info}${suffix}
fi
done
# 输出编译时间情况
echo 开始编译时间:${cmp_start_time}
echo 编译结束时间:$(TZ="Asia/Shanghai" date +%Y年%m月%d日-%H时%M分%S秒)
exit $falied_count
评论区