在import "c"
語句前的注釋可以通過#cgo
語句設定編譯階段
和鏈結階段
的相關引數.
編譯階段的引數主要用於定義相關的巨集
和指定標頭檔案檢索路徑
.
鏈結階段的引數主要是指定庫檔案檢索路徑
和要鏈結的庫檔案
.
// #cgo cflags: -d png_debug=1 -i ./include
// #cgo ldflags: -l /usr/local/lib -l png
// #include import "c"
上面的**中:
cflags
部分,-d
部分定義了png_debug
, 值為1
;-i
定義了標頭檔案包含的檢索目錄.
ldflags
部分,-l
指定了鏈結時檔案檢索目錄,-l
指定了鏈結時需要鏈結png
庫.
因為 c/c++ 遺留的問題, c 標頭檔案檢索目錄可以是相對目錄, 但是庫檔案檢索目錄
則需要是絕對路徑.
在庫檔案的檢索目錄中可以通過$
變數表示當前包含目錄的絕對路徑:
// #cgo ldflags: -l $/libs -l foo
上面的**在鏈結時將被展開為:
// #cgo ldflags: -l /go/src/foo/libs -l foo
#cgo
語句主要影響cflags
,cppflags
,cxxflags
,fflags
,ldflags
這幾個編譯器環境變數.
ldflags
用於設定鏈結階段的引數.
cflags
,cxxflags
,cppflags
,fflags
這幾個變數用於改變編譯階段的構建引數.
對於在cgo環境混合使用c和c++的使用者來說, 可能有三種不同的編譯選項: 其中cflags
對應 c 語言特有的編譯選項,
cxxflags
對應是 c++ 特有的編譯選項,cppflags
則對應 c 和 c++ 共有的編譯選項.
但是在鏈結階段, c 和 c++的鏈結選項是通用的, 因此這個時候已經不再有c和c++語言的區別, 它們的目標檔案的型別是相同的.
#cgo
指令還支援條件選擇, 當滿足某個作業系統或某個cpu架構型別時型別時後面的編譯或鏈結選項生效.
條件選擇:
// #cgo windows cflags: -d x86=1
// #cgo !windows ldflags: -l math
巨集定義案例:
package main
/*#cgo windows cflags: -d cgo_os_windows=1
#cgo darwin cflags: -d cgo_os_drwin=1
#cgo linux cflags: -d cgo_os_linux=1
#if defined(cgo_os_windows)
const char* os = "windows";
#elif defined(cgo_os_darwin)
const char* os = "darwin";
#elif defined(cgo_os_linux)
const char* os = "linux";
#else
const char* os = "unknown";
#endif
*/import "c"
func main()
注意:1.在鏈結c庫的使用, 不支援條件選擇. 並且cgo引數有嚴格的格式
#cgo cflags:...
或者#cgo ldflags: ...
, 即#cgo
和 引數(cflags
,ldflags
)2.對於c語言庫(
.h
檔案定義內容 和.c
檔案實現.h
的定義), 在cgo當中引用.h
檔案, 必須採用動態庫/靜態庫
鏈結的方式, 否則可能無法編譯通過.
golang之cgo 呼叫C C 動態庫函式
之前說過golang呼叫c 的方式可以通過cgo或者是swig,而cgo是不能使用c 相關的東西的,比如標準庫或者c 的物件導向特性。怎麼辦,將c 的功能函式封裝成c介面,然後編譯成動態庫,或者是功能較為簡單的可以直接嵌入到go原始檔中。cgo的使用是在linux平台上,在windows平台上可以配...
cgo使用libevent庫實現乙個定時器
go和c互相呼叫指標 git clone cd libevent mkdir build cd build cmake make main.cpp include event.h struct event ev struct timeval tv void time cb evutil socket...
golang新版本對於cgo支援的乙個坑
檔案test.h如下 ifndef test h define test h ifdef cplusplus extern c endif endif 檔案test.cc如下 include cgo export.h extern c 檔案test.go如下 package test include...