golang之cgo 呼叫C C 動態庫函式

2021-07-15 02:14:15 字數 1015 閱讀 9260

之前說過golang呼叫c**的方式可以通過cgo或者是swig,而cgo是不能使用c++相關的東西的,比如標準庫或者c++的物件導向特性。怎麼辦,將c++的功能函式封裝成c介面,然後編譯成動態庫,或者是功能較為簡單的可以直接嵌入到go原始檔中。

cgo的使用是在linux平台上,在windows平台上可以配置交叉編譯器。

動態庫標頭檔案:myfuns.h
#pragma once

#include

#include

#include

#include

void fun1();

void fun2(int a);

int func3(void **b);

// others

動態庫名:myfuns.so
專案簡化結構:
|-project

| |-lib

| | |-myfuns.so

| |-include

| | |-myfuns.h

| |-src

| | |-main.go

| |-pkg

| |-bin

package main

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

#cgo ldflags: -l../lib -lmyfuns

#include "myfuns.h"

*/import

"c"import (

"fmt"

)func main()

通過cflags配置編譯選項,通過ldflags來鏈結指定目錄下的動態庫。這裡需要注意的乙個地方就是import "c"是緊挨著注釋的,沒有空行。

cgo通過動靜態庫呼叫c c

可以參考 c 靜態庫與動態庫 概括 動靜態庫區別總結 1 鏈結方式不一樣。呼叫階段不同動態庫在程式執行的時候進行呼叫,靜態庫在鏈結階段將彙編檔案與引用到的庫一起鏈結生成可執行檔案。因此前者生成的可執行檔案較後者小。同時,當庫檔案改變時,動態庫只需要重新編譯庫檔案,而靜態庫需要編譯所有檔案。2 庫檔案...

cgo中呼叫C動態庫 靜態庫

include include include 包含header的目錄 cgo cflags i home leen header l指定所在目錄,支援絕對 相對路徑,l指定類庫名稱 去掉前面的lib及後面的.so,如libusbkey.so為 lusbkey 靜態庫方式 字尾名為.a 編譯時庫內容...

c 呼叫c c 動態庫dll筆記

目錄 建立dll 新建dll工程 新增def匯出檔案 匯出函式實現 c 呼叫dll 原始檔 新增新建項 模組定義檔案def def檔案格式,expots後面緊跟匯出的函式名稱 數字累加 library exports showmessage 1 include stdafx.h include st...