Golang调用so文件示例

Golang调用so文件示例,第1张

一:环境

需要借助gcc打包,window下执行有报错,建议再linux环境下

gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)

go version go1.13.8 linux/amd64

二:具体步骤

1、在我们的 $GOPATH/src 路径下创建一个项目

2、在目录下创建一个c语言的头文件 hi.h 内容如下:

int demo(char *);

3、在目录下创建一个c语言的实现 hi.c 内容如下:

hi.c

#include 
#include 

int demo(char * s)
{
	int len = strlen(s);
    int map[256] = {0};				//哈希表
    int res = 0, l = 0, r = 0;
	while(r < len){					//遍历字符串
		if(map[s[r]] == 0){			//不是重复字符,右指针向右移动
            map[s[r++]]++;
        }else{						//遇到重复字符,左指针向左移动
			map[s[l++]]--;
        }
        res = len;		//更新最大长度
    }
	 char a = 'a';
	 s = &a;
     printf("s: %s\n",s);

    return res;
}

   4、在目录下创建go启动文件 main.go 内容如下:

package main

/*
#cgo CFLAGS: -I./ //引入得hi.h位置
#cgo LDFLAGS: -L./lib -lhi //so库地址
#include "hi.h"
#include 
*/
import "C"
import (
	"fmt"
	"unsafe"
)

func main(){
	d := make([]byte,16)
	d = []byte("aabbccdd")
	str := C.CString(string(d))
	fmt.Println(C.demo(str))
	fmt.Println(string(d))
	C.free(unsafe.Pointer(str))
}

 5、编译c文件为so动态库,命令:

gcc -fPIC -shared -o libhi.so hi.c

6.创建lib目录,将编译得libhi.so移动进去

7.编译go build

 

8.执行有可能报错

 

vi /etc/profile

export LD_LIBRARY_PATH=/usr/local/src/lib  //lib所在地址

source /etc/profile 

三:go --> 转换

C.char
C.schar (signed char)
C.uchar (unsigned char)
C.short
C.ushort (unsigned short)
C.int
C.uint (unsigned int)
C.long
C.ulong (unsigned long)
C.longlong (long long)
C.ulonglong (unsigned long long)
C.float
C.double. 


unsafe.Pointer (void*)

// Go string to C string
func C.CString(string) *C.char

var val []byte
(*C.char)(unsafe.Pointer(&val[0]))

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/995043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存