一、前言
最近在學習go,因爲需要調用c語言打包成的so動態庫裏面的方法,避免自己再去造輪子,所以想直接使用golang調用so,但是參考了其他博客大佬寫的,我每一步原封不動的寫下來,結果都是一堆錯誤,錯誤因爲沒有實時的截圖,所以我這裏不會展示出具體出現了哪些錯誤,我將記錄下我成功調用的所有步驟。
二、環境
因爲要將c語言打包,會需要藉助gcc的工具,Windows 32位可以直接藉助MinGW下載,Windows 64位用MinGW的話,後續打包運行的時候會報錯,x86_64這樣的錯誤。所以,我看其他博客內容時下載MinGW-64,因爲我是直接在centos上運行的,所以Windows環境沒有怎麼配置,有需要的朋友可以自己研究一下。
Linux:Centos7、gcc、go
GOROOT:/opt/go
GOPATH:/root/go
三、具體步驟
1、在我們的 $GOPATH/src 路徑下創建一個項目,我這裏隨意寫的 nonels 目錄;
2、在目錄下創建一個c語言的頭文件 hi.h 內容如下:
void hi();
3、在目錄下創建一個c語言的實現 hi.c 內容如下:
#include <stdio.h>
void hi(){
printf("hello world C!\n");
}
4、在目錄下創建go啓動文件 main.go 內容如下:
package main
/*
#cgo CFLAGS: -I./ // 這裏表示頭文件所在的位置
#cgo LDFLAGS: -L/root/go/src/lib -lhi // 這裏表示so庫所在的位置
#include "hi.h"
*/
import "C" // 注意這個地方與上面註釋的地方不能有空行,並且不能使用括號如import ("C" "fmt")
import "fmt"
func main(){
C.hi()
fmt.Println("Hello c, welcome to go!")
}
5、編譯c文件爲so動態庫,命令:
gcc -fPIC -shared -o libhi.so hi.c
這樣會在當前文件夾下生成一個 libhi.so 的文件,便於管理,我將這個文件移到與 nonels同級的 lib 文件下,第一是上面 main.go 文件裏面寫的也是這個路徑;第二是便於管理。
6、在其他的博客裏面,到這裏就結束了,但是我執行到這兒的時候,我就出現這樣的問題:
解決辦法:①、直接度娘 error while loading shared libraries,就會知道其實就是沒有找到這個動態庫,我們編輯:
vim /etc/ld.so.conf 文件,將我們的路徑寫在該文件下,如圖,編輯好後執行:ldconfig
②、將執行文件目錄添加到環境變量中,vim /etc/profile 編輯好後:source /etc/profile
export LD_LIBRARY_PATH=/root/go/src/lib
PS:這裏好像不用添加 ① 也可以,直接使用②添加到環境變量中好像就可以 -- 未深入研究。
ok,到這裏我們再次運行,成功!
四、總結
踩坑提示,靜下心來與大家多多討論,或許突然之間就找到解決方法了,加油!
另外,有個大佬有個pkg-config進行管理,看到覺得不錯,但是還沒有實現出來,先記錄一下,後面再研究: 鏈接