go語言調(diào)用c語言的so動態(tài)庫的實現(xiàn)
背景
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)文章
詳解如何使用go-acme/lego實現(xiàn)自動簽發(fā)證書
這篇文章主要為大家詳細(xì)介紹了如何使用?go-acme/lego?的客戶端或庫完成證書的自動簽發(fā),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03Go語言基于viper的conf庫進(jìn)行配置文件解析
在現(xiàn)代軟件開發(fā)中,配置文件是不可或缺的一部分,如何高效地將這些格式解析到 Go 結(jié)構(gòu)體中,一直是開發(fā)者的痛點,下面我們來看看如何使用conf進(jìn)行配置文件解析吧2025-03-03Golang實現(xiàn)內(nèi)網(wǎng)穿透詳解
這篇文章主要為大家詳細(xì)介紹了Golang實現(xiàn)內(nèi)網(wǎng)穿透的相關(guān)知識,包括原理和代碼實現(xiàn),文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-11-11Golang實現(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-03golang?gorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例
這篇文章主要介紹了golang?gorm的預(yù)加載及軟刪硬刪的數(shù)據(jù)操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04