1. 前言
萌叔有有一个开源项目vearne/passwordbox,用于密码的管理。笔者想法是在Mac上build出多个平台下的bin文件,这样用户,可以无需自己编译,直接使用编译好的bin文件。
可是 vearne/passwordbox 内部依赖了 mattn/go-sqlite3。这个库编译时,依赖操作系统上的共享库,无法直接进行交叉编译。
2. 解决
passwordbox
make docker-img # 只需要执行一次,生成基础镜像即可
make release
就可以同时生成Mac和linux下的bin文件
pwbox-v0.0.10-darwin-amd64.tar.gz
完整代码见Makefile
2.1 build一个基础镜像用于linux环境的编译
docker-img:
docker build --rm -t $(CONTAINER) -f Dockerfile.dev .
Dockerfile.dev
FROM golang:
RUN apt-get update && apt-get install vim-common -y
WORKDIR /go/src/github.com/vearne/passwordbox/
ADD . /go/src/github.com/vearne/passwordbox/
RUN go get
golang:
借助Docker实现跨平台编译
release-linux:
docker run -v `pwd`:$(SOURCE_PATH) -t -e GOOS=linux -e GOARCH=amd64 -i $(CONTAINER) go build $(LDFLAGS) -o pwbox
tar -zcvf pwbox-$(VERSION)-linux-amd64.tar.gz ./pwbox
rm pwbox
pwd
是为了把项目的代码直接挂载到docker中,这样就无需每次拷贝代码到docker中
-i 参数
使用交互模式启动docker,build生成出来的bin文件是直接产生在宿主机上的
3. 共享库依赖错误
[root@dev01]# ./pwbox -v
./pwbox: /lib/x86_64-linux-gnu/: version `GLIBC_8' not found (required by ./pwbox)
进一步
[root@dev01]# ls -l /lib/x86_64-linux-gnu/
lrwxrwxrwx 1 root root 12 Jun 5 01:25 /lib/x86_64-linux-gnu/ -> libc-7.so
这个其实是GNU C Library,它是一个共享库。
报错的原因是在编译环境中
-> libc-8.so
而在部署环境中,libc的版本太低导致。
-> libc-7.so
对于这种情况有2种办法
- 1)升级部署环境的libc(见参考资料1)
- 2)降低编译环境libc的版本,经过测试,libc库是向后兼容的,将基础镜像从golang:退到golang:,对应的问题即可解决。
4. 后记
github里还有一个Golang跨平台编译工具karalabe/xgo, 可以一条命令生成windows、linux、mac下的bin文件。
当然它的思路也是借助docker来实现跨平台的编译。
参考资料
- 升级glibc: 解决”: version ‘’ not found”问题
- The GNU C Library