GO 和C 的相互呼叫 1

2021-10-24 15:00:53 字數 1841 閱讀 5966

愛上了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語言編譯器編譯...