欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語言調(diào)用c語言的so動態(tài)庫的實現(xiàn)

 更新時間:2024年10月15日 10:17:31   作者:快刀一哥  
在Go語言開發(fā)過程中,有時需要調(diào)用C或C++編寫的so動態(tài)庫,本文介紹了如何在Go語言中調(diào)用so庫的步驟和注意事項,包括環(huán)境準(zhǔn)備、編譯生成.so文件、Go文件編寫、以及可能遇到的問題和解決方法,感興趣的可以了解一下

背景

go語言編寫代碼,底層需要一調(diào)用C?C++的so庫,避免自己再去造輪子,所以想直接使用golang調(diào)用so,參考了其他博客大佬寫的,中間出現(xiàn)過很多錯誤,都記錄下來供大家參考  

環(huán)境準(zhǔn)備

因為要將c語言打包,會需要借助gcc的工具,可以直接網(wǎng)上下載安裝,還有g(shù)o工具,也可以在網(wǎng)上直接下載安裝

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

操作步驟

1.創(chuàng)建目錄結(jié)構(gòu)如下

在這里插入圖片描述

2.創(chuàng)建c文件和h文件

創(chuàng)建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;
}

創(chuàng)建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 參數(shù),應(yīng)該可以不加

4.編寫go文件

go設(shè)置 需要打開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.執(zhí)行

編寫完go文件,應(yīng)該就可以執(zhí)行了,但是運(yùn)行的時候會報錯

在這里插入圖片描述

這個從網(wǎng)上查了一下,需要配置一下
sudo vim /etc/ld.so.conf 文件,將我們的路徑寫在該文件下,

在這里插入圖片描述

編輯好后執(zhí)行:sudo ldconfig

之后再運(yùn)行就可以成功了

在這里插入圖片描述

或者在編譯時指定動態(tài)庫的路徑

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

也可以運(yùn)行成功,具體是什么原因大家可以一起交流一下。

補(bǔ)充,思考了一下,因為代碼中配置的動態(tài)庫及位置,是在編譯的時候使用,運(yùn)行時程序在定義的位置查找動態(tài)庫
build能夠編譯成功,運(yùn)行報錯

在這里插入圖片描述

所以解決的方法還可以在lib中添加路徑

export LD_LIBRARY_PATH=/home/meng/cgotest/lib

到此這篇關(guān)于go語言調(diào)用c語言的so動態(tài)庫的實現(xiàn)的文章就介紹到這了,更多相關(guān)go語言調(diào)用c語言so動態(tài)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解golang chan的使用

    深入理解golang chan的使用

    本文主要介紹了golang chan的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 詳解如何使用go-acme/lego實現(xiàn)自動簽發(fā)證書

    詳解如何使用go-acme/lego實現(xiàn)自動簽發(fā)證書

    這篇文章主要為大家詳細(xì)介紹了如何使用?go-acme/lego?的客戶端或庫完成證書的自動簽發(fā),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Go語言基于viper的conf庫進(jìn)行配置文件解析

    Go語言基于viper的conf庫進(jìn)行配置文件解析

    在現(xiàn)代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開發(fā)者的痛點,下面我們來看看如何使用conf進(jìn)行配置文件解析吧
    2025-03-03
  • 一文徹底理解Golang閉包實現(xiàn)原理

    一文徹底理解Golang閉包實現(xiàn)原理

    閉包對于一個長期寫Java的開發(fā)者來說估計鮮有耳聞,光這名字感覺就有點"神秘莫測"。這篇文章的主要目的就是從編譯器的角度來分析閉包,徹底搞懂閉包的實現(xiàn)原理,需要的可以參考一下
    2022-10-10
  • Go語言原子操作atomic的使用

    Go語言原子操作atomic的使用

    本文介紹了Go語言原子操作的使用方法,原子操作是一種無鎖的技術(shù),可通過CPU指令實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Golang實現(xiàn)內(nèi)網(wǎng)穿透詳解

    Golang實現(xiàn)內(nèi)網(wǎng)穿透詳解

    這篇文章主要為大家詳細(xì)介紹了Golang實現(xiàn)內(nèi)網(wǎng)穿透的相關(guān)知識,包括原理和代碼實現(xiàn),文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-11-11
  • Golang實現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式

    Golang實現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式

    本文介紹了如何使用Golang讀取Excel文件并將其轉(zhuǎn)換為JSON格式,通過安裝excelize依賴和創(chuàng)建readExcelToJSON方法,可以實現(xiàn)這一功能,如果需要轉(zhuǎn)換數(shù)據(jù)類型,可以修改相應(yīng)的代碼,需要的朋友可以參考下
    2025-03-03
  • golang?gorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例

    golang?gorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例

    這篇文章主要介紹了golang?gorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • golang使用net/rpc庫實現(xiàn)rpc

    golang使用net/rpc庫實現(xiàn)rpc

    這篇文章主要為大家詳細(xì)介紹了golang如何使用net/rpc庫實現(xiàn)rpc,文章的示例代碼講解詳細(xì),具有一定的借鑒價值,需要的小伙伴可以參考一下
    2024-01-01
  • Golang易錯知識點匯總

    Golang易錯知識點匯總

    這篇文章匯總了在開發(fā)和刷面試題過程中遇到的Golang容易搞錯的知識點,關(guān)鍵部分也都為大家寫了代碼示例,感興趣的小伙伴可以了解一下
    2022-09-09

最新評論