最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang通過cgo調(diào)用C++庫源碼示例

 更新時間:2024年02月18日 10:11:42   作者:xchenhao  
這篇文章主要給大家介紹了關(guān)于golang通過cgo調(diào)用C++庫的相關(guān)資料,CGO是GO語言里面的一個特性,CGO屬于GOLANG的高級用法,主要是通過使用GOLANG調(diào)用CLANG實(shí)現(xiàn)的程序庫,需要的朋友可以參考下

思路

將 C++ 庫包裝成 C 庫 -> golang 通過 cgo 調(diào)用 C 庫

C ++ 相關(guān)文件

目錄列表

  • include/
    • some.h C++ 庫頭文件
    • some_wrapper.h <= 用于將 C++ 庫包裝成 C 庫的頭文件
  • lib/
    • libsome.a C++ 庫
  • src/
    • some_wrapper.cpp <= 用于將 C++ 庫包裝成 C 庫的源碼文件

源碼示例

some.h

#ifndef SOME_H
#define SOME_H

#include <string>
#include <utility>
#include <vector>

namespace Some {
	struct DeviceInfo {
	  std::string id;
	};

	std::vector<std::pair<std::string, std::string>> Generate(const DeviceInfo& device);
}

#endif  // SOME_H

some_wrapper.h

#ifndef SOME_WRAPPER_H
#define SOME_WRAPPER_H

	#ifdef __cplusplus
	extern "C" {
	#endif
	    struct some_item {
	        char version[8];
	        char value[32];
	    };
	
	    struct some_result {
	        struct some_item data[1];
	        int size;
	    };
	
	    int generate(struct some_result* result, char* id);
	
	#ifdef __cplusplus
	}
	#endif

#endif // SOME_WRAPPER_H

some_wrapper.cpp

#include <string.h>
#include "some.h"
#include "some_wrapper.h"

#ifdef __cplusplus
extern "C" {
#endif

    int generate(struct some_result* result, char* id) {
        Some::DeviceInfo deviceInfo;
        deviceInfo.id = id;

        auto v = Some::Generate(deviceInfo);
        strcpy(result->data[0].version, v.first.data());
        strcpy(result->data[0].value, v.second.data());

        result->size = 1;

        return 0;
    }

#ifdef __cplusplus
}
#endif

將 C++ 庫包裝成 C 庫

# 編譯生成 src/some_wrapper.o 臨時目標(biāo)文件
g++ -c -Iinclude src/some_wrapper.cpp -o src/some_wrapper.o

# 生成靜態(tài)庫 lib/libsomewrapper.a
ar -cr lib/libsomewrapper.a src/some_wrapper.o

# 刪除臨時目標(biāo)文件
rm -rf src/some_wrapper.o

Golang CGO 調(diào)用 C 庫

package main

// #cgo CFLAGS: -I  ${SRCDIR}/include
// #cgo LDFLAGS: -L ${SRCDIR}/lib -lsomewrapper -lsome -lstdc++
// #include <stdlib.h>
// #include "some_wrapper.h"
import "C"
import (
	"unsafe"
)

type DeviceInfo struct {
	ID string `json:"id"`
}

func main() {
	di := DeviceInfo{
		ID: "123456",
     }

	cID:= C.CString(di.ID)
	defer C.free(unsafe.Pointer(cID))

	some := &C.struct_some_result{}
	C.generate(some, cId)

	if len(some.data) > 0 {
		item := some.data[0]
		version := C.GoStringN(&(item.version[0]), 8)
		value := C.GoStringN(&(item.value[0]), 32)
	
		result := make(map[string]string, someSize)
		result[version] = value
	
		someSize := int(some.size)
	
		fmt.Println(result, someSize)
	}
}
# 編譯 go 文件
go install -v

# 運(yùn)行
$GOPATH/bin/demo

參考

  • https://pkg.go.dev/cmd/cgo
  • https://stackoverflow.com/questions/41811563/do-i-have-to-free-structs-created-with-cgo

總結(jié) 

到此這篇關(guān)于golang通過cgo調(diào)用C++庫的文章就介紹到這了,更多相關(guān)golang cgo調(diào)用C++庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • GO語言實(shí)現(xiàn)二維碼掃碼的示例代碼

    GO語言實(shí)現(xiàn)二維碼掃碼的示例代碼

    你對二維碼掃碼的流程有困惑嗎,這篇文章就結(jié)合筆者自身的開發(fā)經(jīng)驗(yàn)進(jìn)行分享,讓大家熟悉并掌握此功能,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)一下吧
    2023-06-06
  • Go語言使用sort包對任意類型元素的集合進(jìn)行排序的方法

    Go語言使用sort包對任意類型元素的集合進(jìn)行排序的方法

    這篇文章主要介紹了Go語言使用sort包對任意類型元素的集合進(jìn)行排序的方法,實(shí)例分析了sort排序所涉及的方法與相關(guān)的使用技巧,需要的朋友可以參考下
    2015-02-02
  • 深入了解Golang的map增量擴(kuò)容

    深入了解Golang的map增量擴(kuò)容

    這篇文章主要介紹了深入了解Golang的map增量擴(kuò)容,擴(kuò)容的主要目的是為了縮短map容器的響應(yīng)時間。增量擴(kuò)容的本質(zhì)其實(shí)就是將總的擴(kuò)容時間分?jǐn)偟搅嗣恳淮蝖ash操作上,更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-06-06
  • gRPC中攔截器的使用詳解

    gRPC中攔截器的使用詳解

    這篇文章主要介紹了gRPC中攔截器的使用詳解,本次主要介紹在gRPC中使用攔截器,包括一元攔截器和流式攔截器,在攔截器中添加JWT認(rèn)證,客戶端登錄之后會獲得token,請求特定的API時候需要帶上token才能訪問,需要的朋友可以參考下
    2023-10-10
  • go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作

    go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作

    這篇文章主要介紹了go語言通過反射創(chuàng)建結(jié)構(gòu)體、賦值、并調(diào)用對應(yīng)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05
  • golang的database.sql包和事務(wù)處理操作步驟

    golang的database.sql包和事務(wù)處理操作步驟

    事務(wù)是數(shù)據(jù)庫操作中的一個邏輯單元,由一系列的數(shù)據(jù)庫操作組成,這一系列操作要么全部執(zhí)行并且提交,要么全部回滾,確保數(shù)據(jù)的一致性和完整性,這篇文章主要介紹了golang的database.sql包和事務(wù)處理操作步驟,需要的朋友可以參考下
    2025-04-04
  • 一文詳解golang中的gmp模型

    一文詳解golang中的gmp模型

    這篇文章主要介紹了golang中的gmp模型的誕生、概念及調(diào)度講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • 一文帶你搞懂golang中內(nèi)存分配逃逸分析

    一文帶你搞懂golang中內(nèi)存分配逃逸分析

    這篇文章主要帶大家一起學(xué)習(xí)一下golang中內(nèi)存分配逃逸分析,文中的示例代碼講解詳細(xì),對我們深入了解golang有一定的幫助,感興趣的小伙伴可以了解下
    2023-08-08
  • Go中sync.Once源碼的深度講解

    Go中sync.Once源碼的深度講解

    sync.Once是Go語言標(biāo)準(zhǔn)庫中的一個同步原語,用于確保某個操作只執(zhí)行一次,本文將從源碼出發(fā)為大家詳細(xì)介紹一下sync.Once的具體使用,x希望對大家有所幫助
    2025-01-01
  • 服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運(yùn)行參數(shù)的保存

    服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運(yùn)行參數(shù)的保存

    這篇文章主要介紹了服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運(yùn)行參數(shù)的保存,這里針對使用Go語言編寫的Socket服務(wù)器進(jìn)行實(shí)例說明,需要的朋友可以參考下
    2016-03-03

最新評論

安阳市| 达孜县| 贵南县| 乌拉特前旗| 大厂| 汤阴县| 浦城县| 扬中市| 黎城县| 皮山县| 封丘县| 土默特右旗| 普兰店市| 嘉定区| 张家界市| 南城县| 临潭县| 汾西县| 高安市| 洮南市| 乳山市| 鸡泽县| 苏尼特右旗| 石门县| 博野县| 出国| 辽阳县| 上栗县| 通山县| 兴隆县| 彩票| 皋兰县| 东乌| 渭南市| 鞍山市| 平定县| 靖远县| 阜康市| 师宗县| 巴青县| 会昌县|