c++ - golang alpine docker 交叉编译 C++
问题描述
我有一个依赖 C 进行调用和编译的 golang 项目。现在,我使用make all
命令在golang:alpine的docker镜像中构建,发现如下错误:</p>
/usr/lib/gcc/x86_64-alpine-linux-musl/9.3.0/../../../../x86_64-alpine-linux-musl/bin/ld: /go/pkg/mod/git.ipyker.com/combase/gowork@v0.0.0-20191008073240-ec01ac359684/src/py/cgo/3party/protobuf/libprotobuf.a(structurally_valid.o): relocation R_X86_64_32 against `.rodata' can not be used when making a PIE object; recompile with -fPIE
golang项目中引入了C,我在LDFLAGS中设置了-fPIE参数。</p>
package l5
/*
#cgo CFLAGS: -I./include
#cgo LDFLAGS: -fPIE -L./lib -Wl,-Bstatic -lqos_client -Wl,-Bdynamic -lstdc++
#include "qos_client_c.h"
#include <stdlib.h>
#include <stdint.h>
*/
import "C"
Makefile的内容如下:
VERSION = "2.1"
COMMIT = $(shell git rev-parse --short HEAD)
XCFS_AS = ./bin/xcfs_as
XCFS_FS = ./bin/xcfs_fs
XCFS_FA = ./bin/xcfs_handlefail
all : $(XCFS_AS) $(XCFS_FS) $(XCFS_FA)
$(XCFS_AS) : $(shell find ./pkg/ ./cmd/xcfs_as/ -name "*.go")
go build -o $@ -ldflags "-X main.version=$(VERSION) -X main.commit=$(COMMIT)" ./cmd/xcfs_as/
$(XCFS_FS) : $(shell find ./pkg/ ./cmd/xcfs_fs/ -name "*.go")
go build -o $@ -ldflags "-X main.version=$(VERSION) -X main.commit=$(COMMIT)" ./cmd/xcfs_fs/
$(XCFS_FA) : $(shell find ./pkg/ ./cmd/xcfs_handlefail/ -name "*.go")
go vet ./cmd/xcfs_handlefail/
go build -o $@ -ldflags "-X main.version=$(VERSION) -X main.commit=$(COMMIT)" ./cmd/xcfs_handlefail/
test :
vet :
go vet ./cmd/xcfs_as/
go vet ./cmd/xcfs_fs/
go vet ./cmd/xcfs_handlefail/
clean :
@rm -f ./bin/*
并且我还在 golang:alpine 镜像上进行了以下操作:
apk add gcc g++ cmake make
wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://reg.ipyker.com/artifactory/package-local/alpine-pkg-glibc/2.29-r0/glibc-2.29-r0.apk
wget https://reg.ipyker.com/artifactory/package-local/alpine-pkg-glibc/2.29-r0/glibc-bin-2.29-r0.apk
wget https://reg.ipyker.com/artifactory/package-local/alpine-pkg-glibc/2.29-r0/glibc-i18n-2.29-r0.apk
apk add --no-cache glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk
apk add --no-cache build-base curl automake autoconf libtool git zlib-dev
apk add --no-cache protoc libprotoc libprotobuf-lite libprotobuf
wget http://dl-cdn.alpinelinux.org/alpine/v3.12/main/armhf/protobuf-3.12.2-r0.apk
apk add protobuf-3.12.2-r0.apk
结果还是一样的错误,未解决。。</p>
解决方案
编译共享库被 -no-pie 破坏了,在这种情况下它应该是一个 noop。
go env -w CC="gcc -no-pie"
推荐阅读
- php - Prestashop 1.7。如何使用 $feature.value?
- php - PHP数组对一项进行排序,但其余的顺序相同
- google-sheets - Google Sheet 如何确定单元格是否有图像,如果没有则插入我的图像
- javascript - 更改另一个下拉选项后更改一组单元格的下拉选项
- python - 如何在 re.findall 中使用变量?
- r - ggplot2,如何移动直方图?
- java - 如何从 Java 中的 CSV 文件中查找素数?
- delphi - Sybase:使用 Delphi 和 Firedac 访问表时出错
- laravel - 通过 PostCSS (Laravel Mix) 构建 Tailwind 时的奇怪输出
- html - 影响其他尺寸的响应式变化