golang 學習(1): 使用go語言調用c語言的so動態庫

一、前言

        最近在學習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進行管理,看到覺得不錯,但是還沒有實現出來,先記錄一下,後面再研究: 鏈接

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章