go語言調用c語言的so動態(tài)庫的實現
背景
go語言編寫代碼,底層需要一調用C?C++的so庫,避免自己再去造輪子,所以想直接使用golang調用so,參考了其他博客大佬寫的,中間出現過很多錯誤,都記錄下來供大家參考
環(huán)境準備
因為要將c語言打包,會需要借助gcc的工具,可以直接網上下載安裝,還有go工具,也可以在網上直接下載安裝
sudo apt-get update sudo apt install gcc sudo apt install golang-go
操作步驟
1.創(chuàng)建目錄結構如下

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 參數,應該可以不加
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.執(zhí)行
編寫完go文件,應該就可以執(zhí)行了,但是運行的時候會報錯

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

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

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

所以解決的方法還可以在lib中添加路徑
export LD_LIBRARY_PATH=/home/meng/cgotest/lib
到此這篇關于go語言調用c語言的so動態(tài)庫的實現的文章就介紹到這了,更多相關go語言調用c語言so動態(tài)庫內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
深入學習Golang并發(fā)編程必備利器之sync.Cond類型
Go?語言的?sync?包提供了一系列同步原語,其中?sync.Cond?就是其中之一。本文將深入探討?sync.Cond?的實現原理和使用方法,幫助大家更好地理解和應用?sync.Cond,需要的可以參考一下2023-05-05

