请教一个 Golang Go语言中调用 C++链接库的问题

发布于 1周前 作者 gougou168 来自 Go语言

请教一个 Golang Go语言中调用 C++链接库的问题

有一台设备,通过网线连接,但是通信协议是不公开的。国内经销商提供了.h 头文件、dll 和 lib 链接库的 SDK,以及一套 qt c++写的 demo 。现在希望能融入我们自己原有用 golang 写的系统中,请问该怎么调用呢?网上没找到类似的,都是些 syscall 调用链接库函数做计算的简单案例。cgo 在这种情况下能用吗?

其中,链接库中有虚函数接口,会被一直调用来更新数据,需要实现这个函数来定义数据接收处理办法:

链接库.h 头文件中包含

class A {
public:
    virtual void updateData(const tData *data) = 0;
};

在 demo 里

class B : public A {
    virtual void updateData(const tData *data);
};
void B::updateData(const tData *data) {
    // process data below ...
}

更多关于请教一个 Golang Go语言中调用 C++链接库的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

C++ 没有标准 ABI,一般只能用同一套编译器来调用。这种情况建议包装一下,导出成 C 函数接口给 Golang 使用。

更多关于请教一个 Golang Go语言中调用 C++链接库的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


用 C 标准把你的 c++dll 接口重新封装下.

目前是包装成一个软件后再从网络发出来,就是觉得分开开发和运行太麻烦了。导出接口给 golang 调用的办法好像不太行,接收数据后发起调用的是 c++链接库里发起的

没法重新封装,dll 的源代码在设备厂家手里我们没有,也不会给我们的

为什么不可行?重新封装不需要源代码呀。

因为之前没这么做过,都是 golang 调用 dll 里一个计算函数,算完就返回值给 golang 了。没接触过由 dll 主动发起调用的,也没找到相关的样例

看看 SWIG ?

在 Golang 中调用 C++ 链接库通常涉及使用 cgo,这是 Go 提供的一个工具,允许你在 Go 代码中调用 C 代码。尽管 cgo 直接支持 C 语言,但你可以通过编写一层 C 代码来间接调用 C++ 代码。以下是一个基本的步骤指南:

  1. 编写 C++ 代码:创建一个 .cpp 文件,包含你想要调用的 C++ 函数。

  2. 创建 C 接口:由于 cgo 不直接支持 C++,你需要编写一个 .c.h 文件,声明用 extern "C" 包裹的 C 函数,这些函数内部调用你的 C++ 代码。

  3. 编译 C++ 代码:使用 g++ 或其他 C++ 编译器编译你的 .cpp 文件和 .c 接口文件,生成一个共享库(如 .so 文件在 Linux 上,或 .dylib 文件在 macOS 上,.dll 文件在 Windows 上)。

  4. 在 Go 中使用 cgo:在你的 Go 代码中,使用 // #cgo 指令指定编译器和链接器标志,导入你生成的共享库的头文件,然后使用 import "C" 声明来访问这些 C 函数。

  5. 处理数据类型:确保在 C 接口和 Go 代码之间正确转换数据类型。cgo 提供了一些基本的类型映射,但对于复杂类型,你可能需要手动进行转换。

  6. 编译和运行:使用 go buildgo run 编译和运行你的 Go 程序,它将能够调用你的 C++ 代码。

注意,由于涉及跨语言调用,性能和内存管理是需要特别关注的方面。确保你理解并正确处理这些潜在的问题。

回到顶部