c++ - golang Alpine docker交叉编译C++

标签 c++ docker go

我有一个依赖C进行调用和编译的golang项目。现在,我使用make all命令在golang:alpine的docker镜像中进行构建,发现以下错误:

/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参数。
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
结果仍然是相同的错误,尚未解决。。

最佳答案

使用-no-pie破坏了共享库的编译,在这种情况下,应该没有任何设置。

go env -w CC="gcc -no-pie"

关于c++ - golang Alpine docker交叉编译C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63380091/

相关文章:

docker - 关于Docker容器内文件和文件夹的可用信息是什么?

带有指针接收器的 Golang 方法

docker - 如何唯一标识从 tar 文件导入的 docker 镜像?

java - 我应该在 GKE 引擎上部署 api-gateway 吗?

go - os.OpenFile 权限问题在测试中

amazon-web-services - 使用缓冲过程将图像 URL 上传到 S3

c++ - 在 Linux x64 下使用 libmozjs-52 (SpiderMonkey) 的段错误

c++ - 选择 initializer_list 迭代器定义

c++ - 同一字符串的多个#define是否使用相同的常量字符串?

c++ - 在 Visual Studio 2010 中包含 fwpmu.h 时出错