欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

golang通過cgo調用C++庫源碼示例

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

思路

將 C++ 庫包裝成 C 庫 -> golang 通過 cgo 調用 C 庫

C ++ 相關文件

目錄列表

  • 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 臨時目標文件
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

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

Golang CGO 調用 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

# 運行
$GOPATH/bin/demo

參考

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

總結 

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

相關文章

  • Golang并發(fā)編程中Context包的使用與并發(fā)控制

    Golang并發(fā)編程中Context包的使用與并發(fā)控制

    Golang的context包提供了在并發(fā)編程中傳遞取消信號、超時控制和元數(shù)據(jù)的功能,本文就來介紹一下Golang并發(fā)編程中Context包的使用與并發(fā)控制,感興趣的可以了解一下
    2024-11-11
  • 淺談Golang的GC垃圾回收機制

    淺談Golang的GC垃圾回收機制

    本文介紹了Go語言的垃圾回收機制,通過使用對象池、減少短生命周期對象的創(chuàng)建和優(yōu)化內存布局等方法,可以有效地減少GC壓力,提高程序的性能,感興趣的可以了解一下
    2024-11-11
  • golang中snappy的使用場合實例詳解

    golang中snappy的使用場合實例詳解

    在java 和go語言 大字符傳達的時候, 采用snappy 壓縮 解壓縮是最好的方案。下面這篇文章主要給大家介紹了關于golang中snappy使用場合的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-12-12
  • Golang嵌入資源文件實現(xiàn)步驟詳解

    Golang嵌入資源文件實現(xiàn)步驟詳解

    在應用程序中附帶代碼以外的其他資源可能會很有用,常用的實現(xiàn)方法是嵌入對象或數(shù)據(jù)。在數(shù)據(jù)庫中存儲數(shù)據(jù)應用中,需要定義schema,在應用啟動時創(chuàng)建表,但如果找不到schema文件呢?Go1.16提供embed包讓實現(xiàn)變得簡單,之前很多第三方包實現(xiàn)類似功能
    2023-01-01
  • Golang?urfave/cli庫簡單應用示例詳解

    Golang?urfave/cli庫簡單應用示例詳解

    這篇文章主要為大家介紹了Golang?urfave/cli庫簡單應用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Golang使用Gin框架實現(xiàn)HTTP響應格式統(tǒng)一處理

    Golang使用Gin框架實現(xiàn)HTTP響應格式統(tǒng)一處理

    在gin框架中,我們可以定義一個中間件來處理統(tǒng)一的HTTP響應格式,本文主要為大家介紹了具體是怎么定義實現(xiàn)這樣的中間件的,感興趣的小伙伴可以了解一下
    2023-07-07
  • go實現(xiàn)fping功能

    go實現(xiàn)fping功能

    這篇文章主要介紹了go實現(xiàn)fping功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 使用Golang實現(xiàn)AES加解密的代碼示例

    使用Golang實現(xiàn)AES加解密的代碼示例

    在現(xiàn)代的數(shù)據(jù)安全中,加密和解密是極其重要的一環(huán),其中,高級加密標準(AES)是最廣泛使用的加密算法之一,本文將介紹如何使用Golang來實現(xiàn)AES加密和解密,需要的朋友可以參考下
    2024-04-04
  • Go實現(xiàn)共享庫的方法

    Go實現(xiàn)共享庫的方法

    本文主要介紹了Go實現(xiàn)共享庫的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • golang壓縮與解壓縮文件的示例代碼

    golang壓縮與解壓縮文件的示例代碼

    這篇文章主要給大家介紹了golang壓縮與解壓縮文件,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02

最新評論