1 回答
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
- 1 回答
- 0 關(guān)注
- 460 瀏覽
添加回答
舉報
