我是靠谱客的博主 内向衬衫,这篇文章主要介绍golang之cgo---调用C/C++动态库函数,现在分享给大家,希望可以做个参考。

  之前说过golang调用C代码的方式可以通过cgo或者是swig,而cgo是不能使用C++相关的东西的,比如标准库或者C++的面向对象特性。怎么办,将c++的功能函数封装成C接口,然后编译成动态库,或者是功能较为简单的可以直接嵌入到go源文件中。
  cgo的使用是在linux平台上,在windows平台上可以配置交叉编译器。

复制代码
1
2
动态库头文件:myfuns.h
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once #include <stdio.h> #include <string.h> #include <stdlib.h> #include <stdbool.h> void fun1(); void fun2(int a); int func3(void **b); // others
复制代码
1
2
动态库名:myfuns.so

  

复制代码
1
2
项目简化结构:
复制代码
1
2
3
4
5
6
7
8
9
|-project | |-lib | | |-myfuns.so | |-include | | |-myfuns.h | |-src | | |-main.go | |-pkg | |-bin
复制代码
1
2
go链接动态库:main.go
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main /* #cgo CFLAGS : -I../include #cgo LDFLAGS: -L../lib -lmyfuns #include "myfuns.h" */ import "C" import ( "fmt" ) func main() { // 调用动态库函数fun1 C.fun1() // 调用动态库函数fun2 C.fun2(C.int(4)) // 调用动态库函数fun3 var pointer unsafe.Pointer ret := C.fun3(&pointer) fmt.Println(int(ret)) }

  通过CFLAGS配置编译选项,通过LDFLAGS来链接指定目录下的动态库。这里需要注意的一个地方就是import "C"是紧挨着注释的,没有空行。

最后

以上就是内向衬衫最近收集整理的关于golang之cgo---调用C/C++动态库函数的全部内容,更多相关golang之cgo---调用C/C++动态库函数内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(97)

评论列表共有 0 条评论

立即
投稿
返回
顶部