CGO - GOLANG调用C库

      虽然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,其他语言就暂别考虑了

    

你可能感兴趣的:(c++,golang)