需要借助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]))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)