golang通过cgo调用C++库源码示例

2024-03-01 0 634
目录
  • 思路
  • C ++ 相关文件
    • 目录列表
    • 源码示例
      • some.h
      • some_wrapper.h
      • some_wrapper.cpp
  • 将 C++ 库包装成 C 库
    • Golang CGO 调用 C 库
      • 参考
        • 总结

          思路

          将 C++ 库包装成 C 库->golang 通过 cgo 调用 C 库

          C ++ 相关文件

          目录列表

          • include/
            • some.hC++ 库头文件
            • some_wrapper.h<= 用于将 C++ 库包装成 C 库的头文件
          • lib/
            • libsome.aC++ 库
          • 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++库内容请搜索悠久资源网以前的文章或继续浏览下面的相关文章希望大家以后多多支持悠久资源网!

          您可能感兴趣的文章:

          • Go调用C++动态库实现车牌识别的示例代码
          • C++调用Go方法的字符串传递问题及解决方案

          收藏 (0) 打赏

          感谢您的支持,我会继续努力的!

          打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
          点赞 (0)

          悠久资源 Golang golang通过cgo调用C++库源码示例 https://www.u-9.cn/jiaoben/golang/179112.html

          常见问题

          相关文章

          发表评论
          暂无评论
          官方客服团队

          为您解决烦忧 - 24小时在线 专业服务