go语言调用c语言的so动态库的实现

 更新时间:2024年10月15日 10:17:31   作者:快刀一哥  
在Go语言开发过程中,有时需要调用C或C++编写的so动态库,本文介绍了如何在Go语言中调用so库的步骤和注意事项,包括环境准备、编译生成.so文件、Go文件编写、以及可能遇到的问题和解决方法,感兴趣的可以了解一下

背景

go语言编写代码,底层需要一调用C?C++的so库,避免自己再去造轮子,所以想直接使用golang调用so,参考了其他博客大佬写的,中间出现过很多错误,都记录下来供大家参考  

环境准备

因为要将c语言打包,会需要借助gcc的工具,可以直接网上下载安装,还有go工具,也可以在网上直接下载安装

sudo apt-get update
sudo apt install gcc
sudo apt install golang-go

操作步骤

1.创建目录结构如下

在这里插入图片描述

2.创建c文件和h文件

创建mylibrary.c

#include <stdio.h>

int addtest(int a,int b) {
    int c = a+b;
    printf("Hello from C!\n");
    printf("a + b =%d \n",c);
    return c;
}

创建mylibrary.h

#ifndef MYLIBRARY_H
#define MYLIBRARY_H

int addtest(int a,int b);

#endif

3.编译生成.so

gcc -shared -o ./lib/libmyprint.so include/mylibrary.c

有的文章提到,编译需要加上-fPIC 参数,应该可以不加

4.编写go文件

go设置 需要打开CGO

set CGO_ENABLED=1

编写main.go

package main

/*
#cgo CFLAGS: -I./include   //h头文件的位置
#cgo LDFLAGS: -L/home/meng/cgotest/lib -lmyprint   //so文件的路径及so文件的名称,这里只能使用绝对路径
#include "include/mylibrary.h"
*/
import "C"
import "fmt"
func main() {

	c := C.addtest(2, 3)
	fmt.Println("c value is:", c)
}

5.执行

编写完go文件,应该就可以执行了,但是运行的时候会报错

在这里插入图片描述

这个从网上查了一下,需要配置一下
sudo vim /etc/ld.so.conf 文件,将我们的路径写在该文件下,

在这里插入图片描述

编辑好后执行:sudo ldconfig

之后再运行就可以成功了

在这里插入图片描述

或者在编译时指定动态库的路径

go build -ldflags=“-r ./” main.go

也可以运行成功,具体是什么原因大家可以一起交流一下。

补充,思考了一下,因为代码中配置的动态库及位置,是在编译的时候使用,运行时程序在定义的位置查找动态库
build能够编译成功,运行报错

在这里插入图片描述

所以解决的方法还可以在lib中添加路径

export LD_LIBRARY_PATH=/home/meng/cgotest/lib

到此这篇关于go语言调用c语言的so动态库的实现的文章就介绍到这了,更多相关go语言调用c语言so动态库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言使用对称加密的示例详解

    Go语言使用对称加密的示例详解

    在项目开发中,我们经常会遇到需要使用对称密钥加密的场景,比如客户端调用接口时,参数包含手机号、身份证号或银行卡号等。本文将详细讲解Go语言使用对称加密的方法,需要的可以参考一下
    2022-06-06
  • Go语言运算符的具体使用

    Go语言运算符的具体使用

    本文介绍了Go语言中常用的运算符类型及其使用方法,主要内容包括: 算术运算符,关系运算符,逻辑运算符,位运算符,每种运算符都通过表格形式展示了具体功能,感兴趣的可以了解一下
    2026-06-06
  • 详解Go 1.22 for循环的两处重要更新

    详解Go 1.22 for循环的两处重要更新

    这篇文章主要详细介绍了Go 1.22 for循环的两处重要更新,Go 1.22 版本于 2024 年 2 月 6 日发布,引入了几个重要的特性和改进,在语言层面上,这个版本对 for 循环进行了两处更新,本文将会对 for 循环的两个更新进行介绍,需要的朋友可以参考下
    2024-02-02
  • Golang使用zlib压缩和解压缩字符串

    Golang使用zlib压缩和解压缩字符串

    本文给大家分享的是Golang使用zlib压缩和解压缩字符串的方法和示例,有需要的小伙伴可以参考下
    2017-02-02
  • Golang 之区分类型别名与类型定义的方法

    Golang 之区分类型别名与类型定义的方法

    这篇文章主要介绍了Golang 之区分类型别名与类型定义的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 深入学习Golang并发编程必备利器之sync.Cond类型

    深入学习Golang并发编程必备利器之sync.Cond类型

    Go 语言的 sync 包提供了一系列同步原语,其中 sync.Cond 就是其中之一。本文将深入探讨 sync.Cond 的实现原理和使用方法,帮助大家更好地理解和应用 sync.Cond,需要的可以参考一下
    2023-05-05
  • Go全局异常的实现示例

    Go全局异常的实现示例

    在Go项目开发中,有效的异常处理是确保程序健壮性和稳定性的关键因素之一,全局异常处理机制能够统一处理项目中可能出现的各种异常情况,下面就来介绍一下Go全局异常,感兴趣的可以了解一下
    2025-08-08
  • go循环依赖的最佳解决方案

    go循环依赖的最佳解决方案

      import cycle not allowed(循环依赖不被允许)相信作为每一个golang语言使用研发,都遇到过这个令人头痛的报错,循环依赖是指两个或多个模块之间互相依赖,形成了一个闭环的情况,本文会结合部分案例对解决方案进行讲解,需要的朋友可以参考下
    2023-10-10
  • golang如何实现mapreduce单进程版本详解

    golang如何实现mapreduce单进程版本详解

    这篇文章主要给大家介绍了关于golang如何实现mapreduce单进程版本的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • Golang中漏洞数据库的使用详解

    Golang中漏洞数据库的使用详解

    govulncheck是Golang中的漏洞扫描工具,它强大功能的背后,离不开 Go 漏洞数据库(Go vulnerability database)的支持,所以本文就来为大家详细讲解下 Go 漏洞数据库相关的知识
    2023-09-09

最新评论