请教一个 Golang 调用 C++链接库的问题

2021-03-09 11:43:24 +08:00
 rnicrosoft

有一台设备,通过网线连接,但是通信协议是不公开的。国内经销商提供了.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 ...
}
1688 次点击
所在节点    Go 编程语言
7 条回复
ysc3839
2021-03-09 12:13:42 +08:00
C++ 没有标准 ABI,一般只能用同一套编译器来调用。这种情况建议包装一下,导出成 C 函数接口给 Golang 使用。
jones2000
2021-03-09 12:15:18 +08:00
用 C 标准把你的 c++dll 接口重新封装下.
rnicrosoft
2021-03-10 14:38:20 +08:00
@ysc3839 目前是包装成一个软件后再从网络发出来,就是觉得分开开发和运行太麻烦了。导出接口给 golang 调用的办法好像不太行,接收数据后发起调用的是 c++链接库里发起的
rnicrosoft
2021-03-10 14:39:20 +08:00
@jones2000 没法重新封装,dll 的源代码在设备厂家手里我们没有,也不会给我们的
ysc3839
2021-03-10 16:20:06 +08:00
@rnicrosoft 为什么不可行?重新封装不需要源代码呀。
rnicrosoft
2021-03-10 19:00:05 +08:00
@ysc3839 因为之前没这么做过,都是 golang 调用 dll 里一个计算函数,算完就返回值给 golang 了。没接触过由 dll 主动发起调用的,也没找到相关的样例
zzn
2021-03-18 00:05:04 +08:00
看看 SWIG ?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/759911

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX