在Go语言中使用-buildmode=archive生成归档后,如何静态链接避免重编译
解决方法
要将main.go与已编译的calc.a静态链接且不重新编译calc.go,你可以通过以下两种方式实现:
方法一:使用go build配合-pkgdir参数(推荐)
这个方法让Go工具链直接从指定目录读取已编译的包归档,无需重新编译源文件:
首先确认你的系统架构和操作系统,执行以下命令:
go env GOOS GOARCH会得到类似
linux amd64的输出,后续用$GOOS_$GOARCH指代该组合(比如linux_amd64)。创建符合Go包归档结构的目录:
mkdir -p pkg/$GOOS_$GOARCH/calc将
calc.a移动到这个目录下:mv calc.a pkg/$GOOS_$GOARCH/calc/编译
main.go时,用-pkgdir指定归档所在的根目录:go build -pkgdir ./pkg -o main main.go
这样Go会直接从./pkg/$GOOS_$GOARCH/calc/calc.a读取已编译的calc包,不会再去编译calc.go。
方法二:分步使用Go工具链编译链接
如果你想更清楚地控制编译和链接过程,可以分两步操作:
编译
main.go为目标文件,指定搜索已编译包的目录(需提前按方法一的结构放好calc.a):go tool compile -I ./pkg/$GOOS_$GOARCH -o main.o main.go将
main.o与calc.a链接成可执行文件:go tool link -o main main.o ./pkg/$GOOS_$GOARCH/calc/calc.a
验证编译结果
执行生成的可执行文件,检查是否正常输出:
./main
若输出以下内容,说明链接成功:
Cashier Application Result: 15
内容的提问来源于stack exchange,提问作者Keyboard Penman
相关产品推荐
相关产品推荐

