cgo 系列文章之cgo語句 一

2021-10-08 00:09:20 字數 2514 閱讀 9582

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...