Go语言调用c动态库遇到的一些问题

背景:今天项目中需要在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/





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值