第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何分發(fā)具有 C 依賴項的 Go 模塊

如何分發(fā)具有 C 依賴項的 Go 模塊

Go
猛跑小豬 2022-05-05 17:28:33
我有一個 Go 包——稱之為它——foo我圍繞一些現(xiàn)有的 C 代碼構(gòu)建,我正在嘗試確定如何最好地分發(fā)它。一些背景知識......這是我的目錄結(jié)構(gòu)的簡化版本:foo/  |_ include/      |_ <several other header files>  |_ libs/      |_ <several .so files>  |_ foo.c  |_ foo.h  |_ foo.go一個被剝光的頭foo.gopackage foo// #cgo CFLAGS: -I${SRCDIR}/include// #cgo LDFLAGS: ${SRCDIR}/_foo.so -L${SRCDIR}/libs// #include <stdlib.h>// #include "foo.h"import "C"..._foo.so作為構(gòu)建過程的一部分生成的動態(tài)庫在哪里。我能夠很好地運(yùn)行和測試我的代碼,但我希望能夠分發(fā)它并在一個單獨(dú)的項目中使用它,一個使用go mod. 這就是事情變得有點(diǎn)棘手的地方,我對 Go 的理解變得脆弱。從概念上講,我只是希望能夠?qū)oo/目錄(.so文件和所有)分發(fā)到另一個應(yīng)用程序可以找到并導(dǎo)入它的地方,但是我遇到了幾個絆腳石:我不能把它變成一個二進(jìn)制包,因為我們在 Go 1.13 上,據(jù)我所知,這個功能在 1.12 之后被刪除了。該.so文件的構(gòu)建過程非常龐大,我不希望其他開發(fā)人員不得不花費(fèi) 30 分鐘以上的時間來構(gòu)建該對象。我找到了很多 CGO 演示和博客,但沒有很多關(guān)于如何分發(fā) CGO 包的解釋。有任何想法嗎?值得注意的是,這是針對我公司的,環(huán)境是標(biāo)準(zhǔn)的,所以我不必控制不同的操作系統(tǒng)等。編輯我忘了提到我嘗試過的是將庫烘焙到GOPATHDocker 映像中,并從該基礎(chǔ)構(gòu)建依賴于它的微服務(wù)。但是,使用 構(gòu)建服務(wù)時-mod=vendor,無法在以下位置找到庫GOPATH:RUN GOOS=linux \    GOARCH=amd64 \    CGO_ENABLED=1 \    GOFLAGS=-mod=vendor \    GO111MODULE=on \    go build \    -o service ./cmd/serve/main.go./service# build foo: cannot load foo: open /.../svc/vendor/foo: no such file or directory
查看完整描述

1 回答

?
森林海

TA貢獻(xiàn)2011條經(jīng)驗 獲得超2個贊

對于將來可能遇到類似問題的任何人,以下是我為完成這項工作而采取的步驟。


我將生成的工件烘焙到基礎(chǔ) docker 映像中,例如:

FROM golang:1.13.4


COPY ./foo /go/src/foo/foo

COPY ./foo.mod /go/src/foo

這繞過了必須將.so文件提交到源代碼控制,而不是簡單地將 docker 映像推送到注冊表。


任何需要此庫的服務(wù)都是從該基礎(chǔ)映像構(gòu)建的:

FROM my-foo-base:latest


COPY ./vendor ./vendor

COPY ./go.mod ./

COPY ./go.sum ./


# Put foo in /vendor so it's discoverable, and put its libs where they

# can be discovered

RUN mv /go/src/foo ./vendor && \

    mv ./vendor/foo/foo/libs/*.so /usr/lib/ && \

    mv ./vendor/foo/foo/include/* /usr/include/


# Copy in app code

COPY ./my-app ./my-app


# Required so the app can find the _foo.so shared object

ENV LD_LIBRARY_PATH="/vendor/foo/foo:/usr/lib:${LD_LIBRARY_PATH}"


# Build into a single binary

RUN GOOS=linux \

    GOARCH=amd64 \

    CGO_ENABLED=1 \

    GOFLAGS=-mod=vendor \

    GO111MODULE=on \

    go build \

    -o service ./cmd/serve/main.go

這有效,并且該服務(wù)能夠發(fā)現(xiàn) CGO 包。


查看完整回答
反對 回復(fù) 2022-05-05
  • 1 回答
  • 0 關(guān)注
  • 138 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號