go語言調(diào)用c語言的so動(dòng)態(tài)庫的實(shí)現(xiàn)
背景
go語言編寫代碼,底層需要一調(diào)用C?C++的so庫,避免自己再去造輪子,所以想直接使用golang調(diào)用so,參考了其他博客大佬寫的,中間出現(xiàn)過很多錯(cuò)誤,都記錄下來供大家參考
環(huán)境準(zhǔn)備
因?yàn)橐獙語言打包,會需要借助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)行的時(shí)候會報(bào)錯(cuò)

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

編輯好后執(zhí)行:sudo ldconfig
之后再運(yùn)行就可以成功了

或者在編譯時(shí)指定動(dòng)態(tài)庫的路徑
go build -ldflags=“-r ./” main.go
也可以運(yùn)行成功,具體是什么原因大家可以一起交流一下。
補(bǔ)充,思考了一下,因?yàn)榇a中配置的動(dòng)態(tài)庫及位置,是在編譯的時(shí)候使用,運(yùn)行時(shí)程序在定義的位置查找動(dòng)態(tài)庫
build能夠編譯成功,運(yùn)行報(bào)錯(cuò)

所以解決的方法還可以在lib中添加路徑
export LD_LIBRARY_PATH=/home/meng/cgotest/lib
到此這篇關(guān)于go語言調(diào)用c語言的so動(dòng)態(tài)庫的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)go語言調(diào)用c語言so動(dòng)態(tài)庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何使用go-acme/lego實(shí)現(xiàn)自動(dòng)簽發(fā)證書
這篇文章主要為大家詳細(xì)介紹了如何使用?go-acme/lego?的客戶端或庫完成證書的自動(dòng)簽發(fā),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
Go語言基于viper的conf庫進(jìn)行配置文件解析
在現(xiàn)代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開發(fā)者的痛點(diǎn),下面我們來看看如何使用conf進(jìn)行配置文件解析吧2025-03-03
Golang實(shí)現(xiàn)內(nèi)網(wǎng)穿透詳解
這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)內(nèi)網(wǎng)穿透的相關(guān)知識,包括原理和代碼實(shí)現(xiàn),文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-11-11
Golang實(shí)現(xiàn)讀取excel文件并轉(zhuǎn)換為JSON格式
本文介紹了如何使用Golang讀取Excel文件并將其轉(zhuǎn)換為JSON格式,通過安裝excelize依賴和創(chuàng)建readExcelToJSON方法,可以實(shí)現(xiàn)這一功能,如果需要轉(zhuǎn)換數(shù)據(jù)類型,可以修改相應(yīng)的代碼,需要的朋友可以參考下2025-03-03
golang?gorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例
這篇文章主要介紹了golang?gorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
golang使用net/rpc庫實(shí)現(xiàn)rpc
這篇文章主要為大家詳細(xì)介紹了golang如何使用net/rpc庫實(shí)現(xiàn)rpc,文章的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的小伙伴可以參考一下2024-01-01

