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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用go模塊和cgo時(shí)如何解決循環(huán)依賴

使用go模塊和cgo時(shí)如何解決循環(huán)依賴

Go
繁花不似錦 2022-10-31 17:20:21
在我的項(xiàng)目中,我使用回調(diào)進(jìn)行從 C 到 go 的雙向調(diào)用,反之亦然,使用 CGO。我通過將 C 部分編譯到庫(kù)中,然后將 go 部分編譯到庫(kù)中,然后最后的鏈接器傳遞將它們放在一起,解決了循環(huán)依賴的問題。這在不使用 go 模塊時(shí)工作正常。Go 源文件明確列在命令行上。有人告訴我,從 go 1.12 開始“這不是正確的方法”。隨著項(xiàng)目的發(fā)展,我現(xiàn)在想使用 go 模塊。不幸的是,這改變了 go 編譯器的行為。它現(xiàn)在想要解決外部依賴關(guān)系并將它們隱式包含在輸出文件中。由于循環(huán)依賴,它現(xiàn)在總是以未定義的引用或多個(gè)定義結(jié)束。如何以“正確的方式”使用 cgo 和 go 模塊時(shí)解決循環(huán)依賴關(guān)系?這是說明問題的最小示例。從 Makefile 中的調(diào)用中刪除文件名“hello.go”以查看它是如何分崩離析的。這是錯(cuò)誤消息:hello.c:3: multiple definition of `c_hello'; $WORK/b001/_cgo_hello.o:/tmp/go-build/hello.c:3: first defined here生成文件:libchello.a: Makefile hello.c    gcc -fPIC -c -o chello.o hello.c    ar r libchello.a chello.olibgohello.a: Makefile hello.go libchello.a    env CGO_LDFLAGS=libchello.a go build -buildmode=c-archive -o libgohello.a hello.gomain: Makefile main.c libgohello.a libchello.a    gcc -o main main.c libchello.a libgohello.a -pthread.PHONY: cleanclean:    rm -f main *.a *.o    echo "extern void go_hello();" > libgohello.h你好,去:package main/*extern void c_hello();*/import "C"import "time"import "fmt"//export go_hellofunc go_hello() {    fmt.Printf("Hello from go\n")    time.Sleep(1 * time.Second)    C.c_hello()}func main() {}libgohello.h:extern void go_hello();你好?:#include "libgohello.h"#include <stdio.h>void c_hello() {    printf("Hello from c\n");    go_hello();}主.c:void c_hello();int main() {    c_hello();}去.mod:module hehoe.de/cgocircular
查看完整描述

1 回答

?
偶然的你

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊

如果您查看該go build命令的詳細(xì)輸出,您將看到在將目錄編譯為完整的 go 包時(shí),該main.c文件被包含在hello.go.

文檔中:

當(dāng) Go 工具看到一個(gè)或多個(gè) Go 文件使用了特殊的 import "C" 時(shí),它會(huì)在目錄中查找其他非 Go 文件并將它們編譯為 Go 包的一部分

這里最簡(jiǎn)單的解決方案是將主要的 C 和 Go 包分開,這樣它們就不會(huì)干擾彼此的構(gòu)建過程。對(duì)此進(jìn)行測(cè)試,刪除main.c文件將構(gòu)建libchello.alibgohello.a,然后將其重新添加將完成main.


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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