Go语言调用c动态库遇到的一些问题
2017-09-20 22:06
316 查看
背景:今天项目中需要在go里面调用c的动态库,首先代码中用Cgo实现了一个c函数,c函数中会调用到c动态库中的函数、代码在编译和运行的时候都出现了一错误。package mode
/* 4 #include "getfid.h" 5 #include "lib_queue_conf.h" 6 #include <stdlib.h> 7 #include <string.h> 8 #include <memory.h> 9 #cgo LDFLAGS: -L ./ -ldl -lgetfid 10 #cgo LDFLAGS: -L ./ -ldl -lqueue 11 int cres = 0; 12 key_list_t * querykey(char * data, int len) { 13 qstr_t oemid; 14 oemid.data = data; 15 oemid.len = len; 16 key_list_t * key; 17 key = query_key(&oemid); 18 return key; 19 } 20 void GetFidFromLua(char * url, char * luapath, char * md5, char * version) 21 { 22 // char * md5; 23 // char * version; 24 // md5 = (char *) malloc(129 * sizeof(char)); 25 // version = (char *) malloc(20 * sizeof(char)); 26 memset(md5, 0, 129); 27 memset(version, 0, 20); 28 getfid(url, luapath, md5, version); 29 } 30 */ 31 import "C"【1】首先编译时提示没有c函数定义的错误。 在编译代码是如果没有第 9 、第10行,会报c函数为定义的错误。models/prepublish.go:27:对‘getfid’未定义的引用出现此错误的原因是go里面嵌入的c函数中有对动态库里函数的调用,在调用前不告诉动态库在哪,是谁,编译器无法认识动态库中的函数如上述代码中第9、10行,加上就能指定动态库。cgo LDFLAGS: -L ./ -ldl -lgetfid // -L 指定库文件位置 -ldl 指定库文件名
【2】编译完成后,程序执行是有一个错误
错误提示不能加载动态库
出现此错误的原因是 动态库顾名思义是动态加载的,也就是程序执行的时候加载的。所以如果不在系统中指明动态库的路径程序会运行报错。
Linux 下 在环境变量里面配置 export LIBRARY_PATH=$GOPATH/src/Depend:$LIBARARY_PATH
/Depend 路径下放着动态库。
关于静态库与动态库的知识,这篇博客讲解的很清楚
http://blog.csdn.net/sunshinewave/article/details/39155755
另外Go语言天生特性能兼容c代码。
引用Cgo, 在import“C”前面把要实现的C代码用注释包起来, 调用的时候C.c_func(), 能支持数据类型,函数等各种c类型的调用。
http://cholerae.com/2015/05/17/%E4%BD%BF%E7%94%A8Cgo%E7%9A%84%E4%B8%80%E7%82%B9%E6%80%BB%E7%BB%93/
相关文章推荐
- 在基于 Java 语言的编程中我们经常遇到的一些问题
- 学习JAVA语言过程中遇到了一些问题
- 【Unity】Unity中C#与Android中Java的互相调用遇到的一些问题
- struts2国际化和语言转换遇到的一些问题和解决方案及了解到的2.0的特性
- 学习c语言遇到的一些问题(1)(Linux)(调用库函数)
- Android 调用系统相机拍照并且显示在相册中,以及中间可能会遇到的一些问题的解决
- Go 语言中gin使用gzip压缩遇到的问题
- android开发中调用系统自带的文件选择器遇到的一些问题
- 易语言学习中遇到的一些问题
- stc11f16xe 单片机汇编语言编写遇到的一些问题
- android7.0调用拍照及获取相册,遇到的一些问题
- 转载:.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方案。
- c#调用c/c++ 动态库时遇到unsigned char * 的转换问题
- 关于dll及跨语言调用的问题的一些理解
- java调用动态库(dll)的一些问题
- Go语言中slice作为参数传递时遇到的一些“坑”
- 关于调用某个api遇到的一些问题
- go语言常遇到的问题
- 汇编语言编程中遇到的一个跨文件函数调用问题
- 续:Java Tomcat 中调用.net DLL的方法 - 实际部署中遇到的一些问题解决