CGO顧名思義,是go語言用來調用c函數的工具。如果要使用CGO,首先要先確認一下是否安裝GCC,因為go調用C之前需要將C語言代碼編譯。
本篇博客打算實現一個hello world
例子來作為入門的演示。
首先在main
包下新建一個hello
文件夾。里面有兩個文件hello.c
和hello.h
。
其中hello.h
代碼如下:
// main/hello/hello.h
void SayHello(const char* s);
hello.c
代碼如下:
// main/hello/hello.c
#include <stdio.h>void SayHello(const char* s) {puts(s);
}
將c語言代碼編譯并生成靜態鏈接庫:
gcc -c -o hello.o hello.c
ar rcs libhello.a hello.o
然后編寫go語言的main函數代碼:
// main/main.go
package main//#cgo CFLAGS: -I./hello
//#cgo LDFLAGS: -L${SRCDIR}/hello -lhello
//
//#include "hello.h"
import "C"func main() {C.SayHello(C.CString("Hello, World\n"))
}
注意如下的注釋必須要添加進去:
//#cgo CFLAGS: -I./hello
//#cgo LDFLAGS: -L${SRCDIR}/hello -lhello
//
//#include "hello.h"
在import "C"
語句前的注釋中可以通過#cgo
語句設置編譯階段和鏈接階段的相關參數。編譯階段的參數主要用于定義相關宏和指定頭文件檢索路徑。鏈接階段的參數主要是指定庫文件檢索路徑和要鏈接的庫文件。
上面的代碼中,CFLAGS
部分,-I
定義了頭文件包含的檢索目錄。LDFLAGS
部分,-L
指定了鏈接時庫文件檢索目錄,-l
指定了鏈接時需要鏈接hello
庫。這里面-lhello
就是指靜態鏈接庫libhello.a。
go語言代碼在vscode中可能會報錯,但是可以運行。在終端運行如下命令:
go run main.go
就可以得到結果。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态