golang通過cgo調(diào)用C++庫源碼示例
更新時(shí)間:2024年02月18日 10:11:42 作者:xchenhao
這篇文章主要給大家介紹了關(guān)于golang通過cgo調(diào)用C++庫的相關(guān)資料,CGO是GO語言里面的一個(gè)特性,CGO屬于GOLANG的高級(jí)用法,主要是通過使用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 臨時(shí)目標(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 # 刪除臨時(shí)目標(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Golang并發(fā)編程中Context包的使用與并發(fā)控制
Golang的context包提供了在并發(fā)編程中傳遞取消信號(hào)、超時(shí)控制和元數(shù)據(jù)的功能,本文就來介紹一下Golang并發(fā)編程中Context包的使用與并發(fā)控制,感興趣的可以了解一下2024-11-11
Golang?urfave/cli庫簡單應(yīng)用示例詳解
這篇文章主要為大家介紹了Golang?urfave/cli庫簡單應(yīng)用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
Golang使用Gin框架實(shí)現(xiàn)HTTP響應(yīng)格式統(tǒng)一處理
在gin框架中,我們可以定義一個(gè)中間件來處理統(tǒng)一的HTTP響應(yīng)格式,本文主要為大家介紹了具體是怎么定義實(shí)現(xiàn)這樣的中間件的,感興趣的小伙伴可以了解一下2023-07-07
使用Golang實(shí)現(xiàn)AES加解密的代碼示例
在現(xiàn)代的數(shù)據(jù)安全中,加密和解密是極其重要的一環(huán),其中,高級(jí)加密標(biāo)準(zhǔn)(AES)是最廣泛使用的加密算法之一,本文將介紹如何使用Golang來實(shí)現(xiàn)AES加密和解密,需要的朋友可以參考下2024-04-04

