愛上了golang,c/c++ 又不想放棄。好在go 語言提供了和c語言相互呼叫的機制(cgo )。包括下面幾個問題
本文先討論前面兩個問題。
go 和c++ 相互呼叫是乙個十分有意義的事情,go 語言在編寫網路程式,雲服務等程式時,效率要比c/c++ 高許多倍。使用go 寫乙個web server 只要幾行而已。而c++ 在處理底層介面時更方便一點。
首先寫乙個go 程式
package main
import "c"
import (
"fmt"
)//export foo
func foo(a, b int) int
//export bar
func bar()
func main() {}
注意: 注釋 //export foo 和 //export bar 表示輸出 兩個函式
編譯
go build -o golib.so -buildmode=c-shared *.go
在目錄中產生了兩個檔案:
golib.h
golib.so
c 語言主程式
#include "golib.h"
#include int main()
編譯
gcc callgo.c -o callgo ./golib.so
c 語言庫**(hello.c)
#include void hello(int i)
hello.h
void hello(int);
編譯動態庫
gcc -fpic -shared -o libhello.so hello.c
建立乙個庫目錄mylib,將libhello.so 拷貝到 mylib 目錄中。並且輸出該路徑路徑:
export ld_library_path=./mylib
go**
package main
// #cgo cflags: -i./mylib
// #cgo ldflags: -l./mylib -lhello
// #include "hello.h"
import "c"
import "fmt"
func main()
go 程式編譯
go build callc.go
首先編譯和建立c 靜態庫
gcc -wall -c hello.c
ar -rv libhello.a hello.o
將libhello.a 拷貝到mylib 目標中。
package main
// #cgo cflags: -i./mylib
// #cgo ldflags: ./mylib/libhello.a
// #include "hello.h"
import "c"
import "fmt"
func main()
將cgo ldflags 設定為靜態檔名 // #cgo ldflags: ./mylib/libhello.a
而編譯命令是一樣的
go build callc.go
C和C 相互呼叫
c和c 相互呼叫 2011 11 01 18 42 29 分類 c c 在專案中融合c和c 有時是不可避免的,在呼叫對方的功能函式的時候,或許會出現這樣那樣的問題。近來在主程式是c語言,而呼叫c 功能函式的時候,c 的 h標頭檔案都能找到,功能函式也都定義了,最重要的是,單獨編譯c 的時候完全沒有問...
C 和C的相互呼叫
在c專案中融合c 和c的 是實際工程中不可避免的,就如一般底層的驅動是用c寫的,而應用層一般會用c c 的編譯器能相容c語言的編譯器,但他優先以c 的方式編譯 extern關鍵字強制讓c 編譯器對 進行c方式編譯注意 cplusplus 是c 編譯器都內建的乙個巨集,可以用來判斷是不是c 編譯器,那...
C 和C的相互呼叫
在實際的工程中,c 和c的相互呼叫時不可避免的。但是有時候用c語言的編譯器編譯成的軟體包,在c 的程式中呼叫會出現錯誤。先看一下乙個例子 add.c include add.h int add int a,int b add.h int add int a,int b 將這兩個檔案用c語言編譯器編譯...