cgo在C ++中定义的调用函数(在名称空间中)

奎丁

我有一个要使用的库,它仅提供C ++头文件和一个静态库。Go无法解析其包装的名称空间。

我看了一下:如何在Go中使用C ++?这很有意义,但其中没有名称空间。

这是有问题的C ++代码,在导入时会引起问题(仅显示开头):

#pragma once
#include <stdint.h>

namespace ctre {
namespace phoenix {

这是编译的结果:

./include/ctre/phoenix/ErrorCode.h:4:1: error: unknown type name 'namespace'
 namespace ctre {
 ^~~~~~~~~
./include/ctre/phoenix/ErrorCode.h:4:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
 namespace ctre {

有什么办法可以提供C包装程序来避免此问题?

奎丁

我通过创建一个C包装头文件解决了这个问题。然后,我创建了一个CPP文件,该文件将所述C接口与库CPP标头和库桥接在一起。

C头将我的库对象理解为空指针,并且我的CPP实现必须强制转换它才能访问其所有功能。

extern "C"部分非常重要,它可以防止Go崩溃-防止CPP编译器破坏函数名。

当然,还要将二进制文件与适当的LDFLAGS链接。

凤凰城

typedef void CTalon;

#ifdef __cplusplus
extern "C" {
#endif

CTalon* CTRE_CreateTalon(int port);

void CTRE_Set(CTalon* talon, double output);

void CTRE_Follow(CTalon* slave, CTalon* master);

#ifdef __cplusplus
}
#endif

凤凰网

#include "phoenix.h" // My C wrapper header

#include "ctre/phoenix/motorcontrol/can/TalonSRX.h" // Actual CPP header from library

#define TALON(ctalon) ((ctre::TalonSRX*) ctalon) // Helper macro to make converting to library object easier. Optional

namespace ctre { // Specific to my library which has a lot of long namespaces. Unrelated to problem
    using ctre::phoenix::motorcontrol::ControlMode;
    using ctre::phoenix::motorcontrol::can::TalonSRX;
}

extern "C" {
    CTalon* CTRE_CreateTalon(int port) {
        return (CTalon*) new ctre::TalonSRX(port);
    }

    void CTRE_Set(CTalon* talon, double output) {
        TALON(talon)->Set(ctre::ControlMode::PercentOutput, output);
    }

    void CTRE_Follow(CTalon* slave, CTalon* master) {
        TALON(slave)->Follow(*(TALON(master)));
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++中的名称空间中包含全局函数

CGO中的C NULL类型

C ++声明名称空间中的函数,其名称与全局名称空间中的函数相同

Cgo:对 [C 函数] 的未定义引用

C ++:如何访问相同名称空间中但在不同文件中定义的变量?

在Visual C ++中的不同文件和不同名称空间中使用函数

在C ++中当前名称空间之外的函数调用

在C ++中的命名空间中定义模板类的好友函数时遇到麻烦

C ++错误:输出未在名称空间中定义

无法访问CGO中的C变量

在命名空间中调用 void 函数的 C++ 错误

如何从Go语言调用此C函数(使用Cgo工具)

为什么CGO无法在C中直接调用函数指针?

如何通过CGO从C函数中的内部void *返回[] byte?

通过go模块中的内存地址从.so文件中调用C函数。(cgo)

Cgo可以调用在另一个目录中声明的C函数吗?

在C ++命名空间中声明但在其外部定义的函数是否保留该命名空间中的类型?

使用cgo将函数指针传递给C代码

为什么dlsym在cgo中产生与在c中不同的结果?

(* [1 << 30] C.YourType)在CGo中到底做什么?

CGo不在同一目录中编译C文件

从名称空间中调用特殊函数

我在 C# 中收到错误“命名空间中不存在类型或命名空间名称”

如何在C#中调用特定名称空间的函数

从字符串C#中从另一个名称空间调用函数

C关键字/函数是否未包含在C ++的std名称空间中?

C ++:不同名称空间中的多个运算符定义

C ++通过“使用”在另一个而不是封闭的名称空间中定义类

另一个名称空间中函数的C ++ ADL