Go 生成C动态库.so和静态库.a

源代码

package mainimport "C"
import "fmt"//export hello
func hello(){fmt.Println("hello world")
}
//export add
func add(a,b int) int {return a+b
}
func main(){}

注意:生成C可调用的so时,Go源代码需要以下几个注意。

  1. 必须导入 “C” 包
  2. 必须在可外部调用的函数前加上 【//export 函数名】的注释
  3. 必须是main包,切含有main函数,main函数可以什么都不干

编译

先要安装go的标准库

go install -buildmode=shared -linkshared std

编译共享库

go build -buildmode=c-shared -o so库文件名 自己的项目

然后当前目录就会出现 xxx.h和xxx.so文件

C

#include<stdio.h>
#include"libtest.h" //生成的头文件void main(){hello();printf("\n2+3=%d\n",add(2,3));
}

编译:

gcc goso.c  -L ./ -ltest -o goso

执行

由于是共享库,那么运行时就需要加载需要的库。在linux中默认库的路径为/usr/lib 或者/usr/lib64 。如果想将自己所在的文件夹也添加到库搜索目录中去。那么有两种方式:

  1. 修改配置文件,将自己的目录添加到库搜索目录列表中去。/etc/ld.so.conf 然后执行ldconfig
  2. 修改环境变量,临时改变库搜索路径。 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:自己的目录

如何生成静态库

只需要将buildmode改为c-archive即可。然后编译时将静态库参与编译即可。

Go调用C库

源代码

注意:

需要使用到cgo工具

  1. 直接在import “C”之前添加一个注释。 然后使用C语法添加库的头文件。
  2. 针对共享库由于是操作系统管理程序运行加载的共享库,所以可以不用管,只需要将so库放入对应的目录即可。针对静态库,那么就要在代码中多添加一行,告诉编译器编译时需要连接的库。// #cgo LDFLAGS: -L ./ -lfoo
package main//#cgo LDFLAGS: -L ./ -lfoo     使用静态库时需要添加
//#include"xxx.h"
import "C"
xxxx
func main(){C.xxx(xxx)
}

Golang生成C动态库.so和静态库.a相关推荐

  1. go语言调用c 的头文件 so,Golang生成共享库(shared library)以及Golang生成C可调用的动态库.so和静态库.a...

    Golang类似于C的静态语言,效率也接近于C,如果Golang也可以导出可供C调用的库,那可以和很多高级语言say goodbye了,goodbye似乎又有点武断,但至少说,Golang可以做很多事 ...

  2. Visual studio那些破事。。。(生成静态库、生成动态库、引用静态库、引用动态库)

    共4个小步骤,每个小步骤你都可以新建个VS解决方案,自己跟着步骤跑一下,windows怎么[生成静态库.生成动态库.引用静态库.引用动态库]你就基本明白了@! 文章目录 1.导出静态库.lib(add ...

  3. 库文件:静态库与动态库的生成和使用

    0.引言 当进行C语言的编写时,想要查看标准库的某个函数是怎样实现的,比如 stdio.h 里的 printf 函数,跳转后只能看见函数声明,而无法跳转到函数的定义处,为什么无法查看函数的定义,这就涉 ...

  4. Qt动态库静态库的创建、使用、多级库依赖、动态库改成静态库等详细说明

    本文描述的是windows系统下,通过qtcreator在pro文件中添加动态库与静态库的方法: 1.添加动态库(直接添加动态库文件.dll,非子项目) 通过qtcreator创建动态库的方法就不在此 ...

  5. Visual Studio引入外部库 ---- 弄懂静态库lib和动态库dll

    这两天由于想要研究一下socket的相关内容,但是没想到引入外部库还有这么多门道. 根据维基百科定义:一个现代编译器的主要工作流程如下:源代码(source code)→ 预处理器(preproces ...

  6. Linux下动态库(.so)和静态库(.a)

     linux下有两种库:动态库和静态库(共享库) 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大. 动态库(共享库)的代码在可执行程序运行时才 ...

  7. Ubuntu中动态库.so和静态库.a介绍

    Ubuntu中.so和.a后缀的文件介绍 ( 今天在编译某个开源代码的时候遇到glog库的链接问题,由于对.so和.a动态库和静态库不够明白,于是学习了一波) 转自:http://www.cnblog ...

  8. Linux下动态库(.so)和静态库(.a) 的区别

    linux下有两种库:动态库和静态库(共享库) 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大. 动态库(共享库)的代码在可执行程序运行时才载入内 ...

  9. 【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )

    文章目录 I . 导入 z 库 ( FFMPEG 动态库 与 静态库区别 ) II . FFMPEG 库引入顺序 III . Android Studio 中 FFMPEG 静态库引入完整 CMake ...

最新文章

  1. 安防行业成巨头必争之地 一文梳理安防AI芯片产品与主要企业
  2. 在Matlab符号计算中灵活运用assume
  3. Spring Validation 校验
  4. libinjection开源库的研究总结
  5. 【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析
  6. redis等缓存和mysql的数据同步问题解决思路
  7. windows下安装yarn
  8. 实习日记--git的使用
  9. (读书笔记).NET大局观—.NET引介
  10. VS Code利用GIT对源码进行管理
  11. Vue3 京东到家项目实战第一篇(首页及登录功能开发) 进阶式掌握vue3完整知识体系
  12. 书单收藏 | 17本中信版畅销书从科普、商业到技术带你轻松理解区块链
  13. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dataSource' is defin
  14. SVM支持向量机算法做预测,matlab,预测精度非常高
  15. FCN网络(Fully Convolutional Networks for Semantic Segmentation)
  16. 集成产品开发,不让你的产品变现脚踩西瓜皮
  17. 安卓来电归属地_比尔·盖茨懊悔让微软损失4000亿美金!当年为何会与安卓失之交臂?...
  18. SpringBoot整合redis缓存(一)
  19. android开发_表单上传图片及其它参数
  20. JAVA多线程终止线程、退出线程、Interrupt()方法、苦逼的搬砖工

热门文章

  1. TIOBE 2021年3月程序语言排名 - python要超越Java排第二了?
  2. NGS系列文章 - 高通量测序原理
  3. PDF Expert使用教程:如何在Mac上使用PDF Expert编辑PDF
  4. python编写sql注入工具-利用Python实现SQL注入 - Python黑客编程入门系列 - 8
  5. 2.1基本算法之枚举_1812完美立方
  6. NOIP2013普及组复赛试题_计数问题
  7. 第29课 布纳特老师出的难题 《小学生C++趣味编程》
  8. 第43课 最大公约数 《小学生C++趣味编程》
  9. 哪里有2003系统服务器,服务器2003系统
  10. RTX5 | 线程标志组01 - 线程同步