请教一个 Golang Go语言中调用 C++链接库的问题
请教一个 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
C++ 没有标准 ABI,一般只能用同一套编译器来调用。这种情况建议包装一下,导出成 C 函数接口给 Golang 使用。
更多关于请教一个 Golang Go语言中调用 C++链接库的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
目前是包装成一个软件后再从网络发出来,就是觉得分开开发和运行太麻烦了。导出接口给 golang 调用的办法好像不太行,接收数据后发起调用的是 c++链接库里发起的
没法重新封装,dll 的源代码在设备厂家手里我们没有,也不会给我们的
为什么不可行?重新封装不需要源代码呀。
因为之前没这么做过,都是 golang 调用 dll 里一个计算函数,算完就返回值给 golang 了。没接触过由 dll 主动发起调用的,也没找到相关的样例
看看 SWIG ?
在 Golang 中调用 C++ 链接库通常涉及使用 cgo,这是 Go 提供的一个工具,允许你在 Go 代码中调用 C 代码。尽管 cgo 直接支持 C 语言,但你可以通过编写一层 C 代码来间接调用 C++ 代码。以下是一个基本的步骤指南:
-
编写 C++ 代码:创建一个
.cpp
文件,包含你想要调用的 C++ 函数。 -
创建 C 接口:由于 cgo 不直接支持 C++,你需要编写一个
.c
或.h
文件,声明用extern "C"
包裹的 C 函数,这些函数内部调用你的 C++ 代码。 -
编译 C++ 代码:使用 g++ 或其他 C++ 编译器编译你的
.cpp
文件和.c
接口文件,生成一个共享库(如.so
文件在 Linux 上,或.dylib
文件在 macOS 上,.dll
文件在 Windows 上)。 -
在 Go 中使用 cgo:在你的 Go 代码中,使用
// #cgo
指令指定编译器和链接器标志,导入你生成的共享库的头文件,然后使用import "C"
声明来访问这些 C 函数。 -
处理数据类型:确保在 C 接口和 Go 代码之间正确转换数据类型。cgo 提供了一些基本的类型映射,但对于复杂类型,你可能需要手动进行转换。
-
编译和运行:使用
go build
或go run
编译和运行你的 Go 程序,它将能够调用你的 C++ 代码。
注意,由于涉及跨语言调用,性能和内存管理是需要特别关注的方面。确保你理解并正确处理这些潜在的问题。