登录
首页 >  Golang >  Go问答

golang alpine docker 交叉编译C++

来源:stackoverflow

时间:2024-04-27 14:09:35 120浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《golang alpine docker 交叉编译C++》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

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

/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/[email protected]/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 
#include 
*/
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 破坏,在这种情况下应该是一个 noop。

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>