亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

cgo 調用 C++ 中定義的函數(位于命名空間中)

cgo 調用 C++ 中定義的函數(位于命名空間中)

Go
喵喔喔 2023-07-31 16:09:16
我有一個我想使用的庫,它只提供 C++ 頭文件和靜態庫。Go 無法解析它所包裝的名稱空間。我看過這個:How to use C++ in Go? 這是有道理的,但其中不涉及名稱空間。這是有問題的 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 包裝器來避免這個問題嗎?
查看完整描述

1 回答

?
慕哥6287543

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)));

    }

}


查看完整回答
反對 回復 2023-07-31
  • 1 回答
  • 0 關注
  • 286 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號