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的context包提供了在并發(fā)編程中傳遞取消信號、超時控制和元數(shù)據(jù)的功能,本文就來介紹一下Golang并發(fā)編程中Context包的使用與并發(fā)控制,感興趣的可以了解一下2024-11-11Golang使用Gin框架實現(xiàn)HTTP響應格式統(tǒng)一處理
在gin框架中,我們可以定義一個中間件來處理統(tǒng)一的HTTP響應格式,本文主要為大家介紹了具體是怎么定義實現(xiàn)這樣的中間件的,感興趣的小伙伴可以了解一下2023-07-07