golang通过cgo调用C++库源码示例
作者:xchenhao
这篇文章主要给大家介绍了关于golang通过cgo调用C++库的相关资料,CGO是GO语言里面的一个特性,CGO属于GOLANG的高级用法,主要是通过使用GOLANG调用CLANG实现的程序库,需要的朋友可以参考下
思路
将 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 # 生成静态库 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++库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!