我有一个依赖 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/