1 回答
TA贡献1831条经验 获得超10个赞
我通过创建 C 包装头文件来解决这个问题。然后我创建了一个 CPP 文件,它将所述 C 接口与库 CPP 标头和库桥接起来。
C 标头将我的库对象理解为 void 指针,并且我的 CPP 实现必须对其进行强制转换才能访问其所有函数。
这extern "C"部分非常重要,可以防止 Go 崩溃——它可以防止 CPP 编译器修改函数名称。
当然,还要将二进制文件链接到正确的 LDFLAGS。
凤凰.h
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
凤凰.cpp
#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)));
}
}
- 1 回答
- 0 关注
- 214 浏览
添加回答
举报