CGO - GOLANG调用C库

2 篇文章 0 订阅

      虽然C代码很难写,尤其是内存管理,但不得不承认,目前很多开源项目都还是用纯C编写的,我想主要还是执行效率高和商业发布时不容易反编译(次要)。因此之前在用java时使用到了JNI调用C代码,那么Go语言则可使用CGO调用C语言代码。

     当前就遇到了一个现实的场景,即我们使用go语言开发git hook,主要实现权限验证,大文件二进制验证等功能。它使用开源git2go,而git2go又是依赖c语言库libgit2,那么他们之间的调用方式正是使用CGO


    给个cgo的helloworld吧,不难,一看就能懂https://blog.csdn.net/win_lin/article/details/51734588

 

   然而真正的坑在于,使用cgo生成的hook可执行文件,是动态依赖外部的库,可以用ldd命令即可查看它动态依赖了好多系统的so库,因此如果生产环境是不同的linux环境则会遇到很多问题。以下给出几种解决方案

   1.每个环境都以源码重新编译。     -该方案不太现实,毕竟环境还需要装golang,gcc等等

   2.使用静态编译。  查了以下静态编译的方法是go build -ldflags -extldflags=-static ,并通过一系列环境变量指定库,头文件地址。

     指定库路径的方法https://blog.csdn.net/jaylong35/article/details/6132087

    pkgconfig引入环境变量https://blog.csdn.net/newchenxf/article/details/51750239

     这个方案,反正我是没搞定,坑大发了,一会少这个库一会少那个库,等都补齐了又报各种引用找不到的链接错误。这也难怪,C语言没有类似maven/gradle之类的包管理工具,导致版本依赖非常麻烦

   3.使用一个固定的docker容器来执行hook,这个方法我觉得可行,需要等老大决策

   4.放弃当前的git2go库,使用纯go的库 go-git。   应该可行,但有一定改动工作量,也需要老大决策

   5.使用纯c开发hook,静态编译libgit2。   这个肯定可行,而且效率高,但纯c开发太。。。。但总之为了性能,只能选用c和go,其他语言就暂别考虑了

    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值