侧边栏壁纸
博主头像
Eoser's page! 博主等级

@学习@生活@自己

  • 累计撰写 114 篇文章
  • 累计创建 29 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Golang交叉编译第三弹–交叉编译工具链与脚本进阶

eoser
2023-03-28 / 0 评论 / 0 点赞 / 1 阅读 / 0 字

安装交叉编译工具链

还是我太天真了,还是要安装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交叉编译没找到工具,脚本中已经提了出来,后面再看看吧

压缩

对我的工程代码量来说编译的文件有点大,想办法压缩下

  1. upx压缩
    # 安装程序
    apt install upx-ucl
    # 压缩
    upx 二进制文件
  2. strip压缩
    strip 二进制文件
  3. 静态库编译 不推荐,我觉得这样失去了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
0

评论区