golang呼叫c 檔案

2021-10-23 13:23:15 字數 1870 閱讀 2145

1,將c++ 的方法提取到頭檔案.h中( )

2,編譯cc(c++)檔案為動態鏈結庫so檔案  gcc -fpic -shared hello.c -o libhello.so 

3,將標頭檔案放入include目錄 .so放入lib目錄

4,go程式中指定 cflags 和 ldflags

#cgo  cflags:  -i  ./include 

#cgo  ldflags:  -l .

-wl,-rpath,/usr/local

5,執行(go 程式的時候)發布時候指定 export ld_library_path="lib檔案所在目錄" (`pwd`)

export ld_library_path=./lib

目錄結構: 

|-project

| |-lib

| | |-libhello.so

| |-include

| | |-hello.h

| |-src

| | |-main.go

| |-pkg

| |-bin

編譯為so檔案

g++ -g -wall -lssl -lcrypto -c decrypter.cc -fpic -shared -olibdecrypter.so
go檔案:

package main  

/* #cgo cflags: -i ./include

#cgo ldflags: -l ./lib -lhello

#include "hello.h"

*/

import "c"

func main()

hello.c

#include "hello.h"

#include void hello(const char *str)

hello.h

#ifndef ___hello___

#define __hello___

void hello(const char *str);

#endif

編譯: go build main.go 

編譯如果出錯:  

# command-line-arguments

/tmp/go-build471704263/command-line-arguments/_obj/xx.cgo2.o: in function `_cgo_7f644bb4ca7c_cfunc_***x':

請一定檢查so檔案是否為lib***.so 

編譯如果報錯 could not determine kind of name for c.***

請檢查 import "c" 是不是緊挨著 go頂部標頭檔案c++ 部分注釋**

執行:  ./main

執行如果出現:     error while loading shared libraries: ***.so: cannot open shared object file: no such file or directory

請一定要 export ld_library_path="動態鏈結檔案所在目錄"  

其他說明:golang的注釋中直接寫函式內容的方式只支援c不支援c++  

package main  

//!!!!以下為c**不支援c++

/* #include #include #include void hello(const char *str)

*/

import "c"

func main()

Golang反射呼叫函式

首先,來看看這段 php view source print?1functionfoobar 4 funcs array 5 foobar foobar 6 hello foobar 7 8 funcs foobar 9 funcs hello 它會輸出 view source print?1mik...

golang呼叫lua指令碼

import github.com aarzilli golua lua 2 呼叫lua指令碼的幾個重要函式 l lua.newstate 建立乙個lua虛擬機器 l.dofile 設定要呼叫的lua檔案 l.getfield lua.lua globalsindex,獲取lua指令碼的符號 l.c...

golang延遲呼叫(defer)

defer特性 關鍵字 defer 用於註冊延遲呼叫。這些呼叫直到 return 前才被執。因此,可以用來做資源清理。多個defer語句,按先進後出的方式執行。defer語句中的變數,在defer宣告時就決定了。defer用途 關閉檔案控制代碼 鎖資源釋放 資料庫連線釋放 defer的觸發packa...