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动态库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入理解golang chan的使用

    深入理解golang chan的使用

    本文主要介绍了golang chan的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 详解如何使用go-acme/lego实现自动签发证书

    详解如何使用go-acme/lego实现自动签发证书

    这篇文章主要为大家详细介绍了如何使用 go-acme/lego 的客户端或库完成证书的自动签发,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • Go语言基于viper的conf库进行配置文件解析

    Go语言基于viper的conf库进行配置文件解析

    在现代软件开发中,配置文件是不可或缺的一部分,如何高效地将这些格式解析到 Go 结构体中,一直是开发者的痛点,下面我们来看看如何使用conf进行配置文件解析吧
    2025-03-03
  • 一文彻底理解Golang闭包实现原理

    一文彻底理解Golang闭包实现原理

    闭包对于一个长期写Java的开发者来说估计鲜有耳闻,光这名字感觉就有点"神秘莫测"。这篇文章的主要目的就是从编译器的角度来分析闭包,彻底搞懂闭包的实现原理,需要的可以参考一下
    2022-10-10
  • Go语言原子操作atomic的使用

    Go语言原子操作atomic的使用

    本文介绍了Go语言原子操作的使用方法,原子操作是一种无锁的技术,可通过CPU指令实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • Golang实现内网穿透详解

    Golang实现内网穿透详解

    这篇文章主要为大家详细介绍了Golang实现内网穿透的相关知识,包括原理和代码实现,文中的示例代码讲解详细,有需要的小伙伴可以参考一下
    2024-11-11
  • Golang实现读取excel文件并转换为JSON格式

    Golang实现读取excel文件并转换为JSON格式

    本文介绍了如何使用Golang读取Excel文件并将其转换为JSON格式,通过安装excelize依赖和创建readExcelToJSON方法,可以实现这一功能,如果需要转换数据类型,可以修改相应的代码,需要的朋友可以参考下
    2025-03-03
  • golang gorm的预加载及软删硬删的数据操作示例

    golang gorm的预加载及软删硬删的数据操作示例

    这篇文章主要介绍了golang gorm的预加载及软删硬删的数据操作示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • golang使用net/rpc库实现rpc

    golang使用net/rpc库实现rpc

    这篇文章主要为大家详细介绍了golang如何使用net/rpc库实现rpc,文章的示例代码讲解详细,具有一定的借鉴价值,需要的小伙伴可以参考一下
    2024-01-01
  • Golang易错知识点汇总

    Golang易错知识点汇总

    这篇文章汇总了在开发和刷面试题过程中遇到的Golang容易搞错的知识点,关键部分也都为大家写了代码示例,感兴趣的小伙伴可以了解一下
    2022-09-09

最新评论