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

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

在 Go 程序中使用 cgo 共享庫

在 Go 程序中使用 cgo 共享庫

Go
POPMUISE 2022-10-31 15:35:25
試圖測試cgo,所以我寫了以下內(nèi)容://go:build lib// +build libpackage mainimport "C"import "fmt"//export HelloWorldfunc HelloWorld() {    fmt.Printf("hello world")}func main() {}// go build -tags lib -buildmode=c-shared -o golib.a lib.go并將其編譯為:$ go build -tags lib -buildmode=c-shared -o golib.a lib.go嘗試在另一個代碼中使用生成的共享庫://go:build app// +build apppackage main// #cgo CFLAGS: -g -Wall// #include <stdlib.h>// #include "golib.h"import "C"func main() {    C.HelloWorld()}// go run main.go但我收到以下錯誤:# command-line-argumentsUndefined symbols for architecture x86_64:  "_HelloWorld", referenced from:      __cgo_a844f0d618a1_Cfunc_HelloWorld in _x002.o     (maybe you meant: __cgo_a844f0d618a1_Cfunc_HelloWorld)ld: symbol(s) not found for architecture x86_64clang: error: linker command failed with exit code 1 (use -v to see invocation)# command-line-argumentscgo-gcc-prolog:47:33: warning: unused variable '_cgo_a' [-Wunused-variable]此外,我在 mac 上使用 VS 代碼收到以下錯誤:go list failed to return CompiledGoFiles. This may indicate failure to perform cgo processing; try building at the command line. See https://golang.org/issue/38990在此處輸入圖像描述
查看完整描述

1 回答

?
慕桂英3389331

TA貢獻2036條經(jīng)驗 獲得超8個贊

你不能在 Go 程序中使用 cgo 共享庫,因為你不能在同一個進程中有多個 Go 運行時。


嘗試這樣做會給出錯誤:


# command-line-arguments

cgo-gcc-prolog:67:33: warning: unused variable '_cgo_a' [-Wunused-variable]

fatal error: unexpected signal during runtime execution

[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x43fd5e2]


goroutine 1 [running, locked to thread]:

runtime.throw({0x40a875b?, 0x1c00011b800?})

        /usr/local/go/src/runtime/panic.go:992 +0x71 fp=0x1c00004a960 sp=0x1c00004a930 pc=0x402f6d1

runtime: unexpected return pc for runtime.sigpanic called from 0x43fd5e2

stack: frame={sp:0x1c00004a960, fp:0x1c00004a9b0} stack=[0x1c00004a000,0x1c00004b000)

....

0x000001c00004aaa0:  0x0000000000000000  0x0000000000000000 

runtime.sigpanic()

        /usr/local/go/src/runtime/signal_unix.go:781 +0x3a9 fp=0x1c00004a9b0 sp=0x1c00004a960 pc=0x4043449

exit status 2

要從 go 調(diào)用 c 代碼,有 3 種可能的方法:


內(nèi)聯(lián)編碼,如:

package main


//#include  <stdio.h>

//int Add(int a, int b){

//    printf("Welcome from external C function\n");

//    return a + b;

//}

import "C"

import "fmt"


func main() {

    fmt.Println(C.Add(5, 2))

}

靜態(tài)鏈接,您同時擁有.c和.h文件,如:

// lib.c

#include  <stdio.h>

int Add(int a, int b){

    printf("Welcome from external C function\n");

    return a + b;

}


// libadd.h

int Add(int, int);

go 文件是:


// main.go

package main


// #include "libadd.h"

import "C"

import "fmt"


func main() {

    x := C.Add(1, 2)

    fmt.Println(x)


}

我們必須將文件運行為go run .或go run github.io/xxx // go run main.go 將不起作用,因為它只會考慮 main.go,而不考慮 C 文件


動態(tài)鏈接,您將上述c文件編譯為clang -shared -fpic -Wall -g lib.c -o libadd.so并將 go 文件作為:

// main.go

package main


//#cgo CFLAGS: -g -Wall

//#cgo LDFLAGS: -L. -ladd

//#include "libadd.h"

import "C"

import "fmt"


func main() {

    x := C.Add(1, 2)

    fmt.Println(x)

}

這里你可以使用go run main.go通過硬代碼連接的庫,分發(fā)二進制文件,共享庫loadadd.so需要與相同的二進制文件一起分發(fā)并且存在于同一個文件夾中。


我在這里為每個案例上傳了單獨的文件夾。


獎勵 要使用 ac 程序在 go 中調(diào)用生成的共享庫,我們可以使用以下命令:


// main.c

#include <stdio.h>

#include "libadd.h" // calling C file

#include "libgo.h" // calling shared library generated by GO


int main()

{

    HelloWorld();

    int x = Add(1, 2);

    printf("%d",x);

    return 0;

}

將文件編譯為:


clang -o main -L. -ladd -lgo main.c   // -ladd => -l (library) is libadd


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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