当前位置:   article > 正文

go 调用C语言函数或者库

go 调用C语言函数或者库

1.查看cgo是否开启

  1. go env | grep CGO_ENABLED
  2. CGO_ENABLED='1'

2. go程序中加入 import "C" 

通过 import “C” 语句启用 CGO 特性后,CGO 会将上一行代码所处注释块的内容视为 C 代码块

单行注释使用//
多行注释使用/*   */

3. go 与C 类型转换

在go安装目录 src\cmd\cgo 中定义

  1. func C.CString(string) *C.char
  2. func C.CBytes([]byte) unsafe.Pointer
  3. func C.GoString(*C.char) string
  4. func C.GoStringN(*C.char, C.int) string
  5. func C.GoBytes(unsafe.Pointer, C.int) []byte

GO语言与C语言的数据类型对应表

3. 直接在go文件中使用函数

  1. package main
  2. /*
  3. #include <stdio.h>
  4. int printHello(const char *str){
  5. printf("%s\n",str);
  6. return 3;
  7. }
  8. */
  9. import "C"
  10. import (
  11. "fmt"
  12. )
  13. func main() {
  14. fmt.Println("Hello World!")
  15. fmt.Println(C.printHello(C.CString("nihao")))
  16. }

4.使用动态库

myprint.c

  1. #include "myprint.h"
  2. #include <stdio.h>
  3. int printHello(const char *str){
  4. printf("%s\n",str);
  5. return 3;
  6. }

myprint.h

  1. #ifndef __MYPRINTF_H
  2. int printHello(const char *str);
  3. #endif

编译动态库

gcc -fPIC -shared -o libmyprint.so myprint.c

将编译后的动态库拷贝至系统lib路径 ,或者自定义路径下 然后修改/etc/ld.so.conf

执行ldconfig

使用动态库序号包含3行

#cgo CFLAGS: -ImyLibIncPath
#cgo LDFLAGS:  -LmyLibIncPath -lmyprint
#include "myprint.h"

  1. package main
  2. /*
  3. #cgo CFLAGS: -I./
  4. #cgo LDFLAGS: -L./ -lmyprint
  5. #include "myprint.h"
  6. */
  7. import "C"
  8. import (
  9. "fmt"
  10. )
  11. func main() {
  12. fmt.Println("Hello World!")
  13. fmt.Println(C.printHello(C.CString("nihao")))
  14. }

5.go与c数据转换可以参考

https://www.cnblogs.com/zhaoyingjie/p/15683384.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/1003575
推荐阅读
相关标签
  

闽ICP备14008679号