go語言如何調用c函數

  1. 直接嵌入c源代碼到go代碼裏面
package main

/*
#include <stdio.h>

void myhello(int i) {
  printf("Hello C: %d\n", i);
}
*/
import "C"

import "fmt"

func main() {
  C.myhello(C.int(12))
  fmt.Println("Hello Go");
}
  1. 需要注意的是C代碼必須放在註釋裏面
  2. import "C"語句和前面的C代碼之間不能有空行

運行結果

$ go build main.go && ./main
Hello C: 12
Hello Go
  1. 分開c代碼到單獨文件

嵌在一起代碼結構不是很好看,很多人包括我,還是喜歡把兩個分開,放在不同的文件裏面,顯得乾淨,go源文件裏面是go的源代碼,c源文件裏面是c的源代碼。

$ ls 
hello.c  hello.h  main.go
$ cat hello.h 
void hello(int);
$ cat hello.c
#include <stdio.h>

void hello(int i) {
  printf("Hello C: %d\n", i);
}
$ cat main.go 
package main

// #include "hello.h"
import "C"

import "fmt"

func main() {
  C.hello(C.int(12))
  fmt.Println("Hello Go");
}

編譯運行

$ go build && ./main
Hello C: 12
Hello Go
  1. 編譯成庫文件

如果c文件比較多,最好還是能夠編譯成一個獨立的庫文件,然後go來調用庫。

$ find mylib main  
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go

編譯庫文件

$ cd mylib
# gcc -fPIC -shared -o libhello.so hello.c

編譯go程序

$ cd main
$ cat main.go 
package main

// #cgo CFLAGS: -I../mylib
// #cgo LDFLAGS: -L../mylib -lhello
// #include "hello.h"
import "C"

import "fmt"

func main() {
  C.hello(C.int(12))
  fmt.Println("Hello Go");
}
$ go build main.go

運行

$ export LD_LIBRARY_PATH=../mylib
$ ./main 
Hello C: 12
Hello Go
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章