CGO編譯鏈結

2021-10-04 10:02:47 字數 1150 閱讀 6844

對於自己實現的簡單的c碼,cgo編譯鏈結時並不複雜,只要按照cgo的指導,引用好標頭檔案,注意cgo的格式要求基本就沒問題。

cgo的格式要求:

通過注釋符號"//"或者「/* */」,將c檔案需要引用的標頭檔案、編譯選項、鏈結選項、編譯巨集等引用起來。cflags和ldflags也可以分多行寫。$可以取得當前檔案的絕對路徑,在include標頭檔案或庫時很有用。

例如:/*

#cgo cflags: -i ../../include -i ../../***/include

#cgo cflags: -i ../aaa/include

#cgo ldflags: -l ../../lib -l ../../***/lib64 -l*** -lppp

#include

*/import "c"

或者://#cgo cflags: -i ../../include -i ../../***/include

//#cgo cflags: -i ../aaa/include

//#cgo ldflags: -l ../../lib -l ../../***/lib64 -l*** -lppp

//#include

improt "c"

對於眾多的標頭檔案引用和庫檔案的依賴,就有些複雜了。可以邊編譯,邊修正標頭檔案的引用。

對於clfags和ldfalgs預設情況下cgo只給放開了一些基本的選項可以使用,如果需要使用更多的選項就需要對cgo_cflags_allow、cgo_ldflags_allow等進行設定,允許使用更多的鏈結選項。linux下通過export cgo_cflags_allow=『--sysroot.*』 這樣來啟用更多的選項值。

參考:對於一些庫鏈結,明明已經設定了鏈結路徑,及庫檔案,仍提示某些依賴函式未定義,此時有可能是編譯檔案和庫的先後順序問題。比如:工作中遇到乙個libsystem.so庫對libdl.so.2庫有依賴,

參考:unresolvable r_x86_64_none relocation against symbol `__fentry__@@glibc_2.13' 大部分情況下可能是網上最常見的原因-fpic編譯選項的問題,但也有可能是缺少動態庫鏈結的問題。比如編譯時需要a.so,但a.so又依賴b.so、c.so等,而編譯鏈結選項中又沒有鏈結b.so、c.so等,就有肯能會報這個錯誤

golang交叉編譯CGO

記錄在macos上編譯windows和linux的go程式,帶cgo呼叫c 比如go sqlite3包,已測試通過。1.windows平台 mingw w64 安裝編譯器 brew install mingw w64 編譯指令 cgo enabled 1 goos windows goarch am...

cgo 系列文章之cgo語句 一

在import c 語句前的注釋可以通過 cgo語句設定編譯階段和鏈結階段的相關引數.編譯階段的引數主要用於定義相關的巨集和指定標頭檔案檢索路徑.鏈結階段的引數主要是指定庫檔案檢索路徑和要鏈結的庫檔案.cgo cflags d png debug 1 i include cgo ldflags l ...

cgo 結構體指標 cgo講義及練習

前提條件 了解go語言和c語言的基本知識和基本用法。一 什麼是cgo 簡單地說,cgo是在go語言中使用c語言 的一種方式。二 為什麼要有cgo c語言經過數十年發展,經久不衰,各個方面的開源 閉源庫已經非常豐富。這無疑是一塊巨大的寶藏,對於一門現代程式語言而言,如何用好現成的c 就顯得極為重要。三...