您的位置 首页 golang

go语言如何调用c函数

 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
  

分开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
  

编译成库文件

如果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 LD FLAGS : -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  

文章来源:智云一二三科技

文章标题:go语言如何调用c函数

文章地址:https://www.zhihuclub.com/86416.shtml

关于作者: 智云科技

热门文章

发表评论

您的电子邮箱地址不会被公开。

网站地图