我有一个要使用的库,它仅提供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] 删除。
我来说两句