Пишу интеграцию C++ и Rust через CXX
Сигнатура функции C++ в myclient.h
public:
bool connect(const char * host, int port, int clientId = 0);
Что мне добавить в main.rs
, чтобы его можно было вызывать из ржавчины? Я пробовал много комбо
fn connect(host: &mut , port: u64, clientId: u64 ) -> bool;
fn connect(host: *char , port: u64, clientId: u64 ) -> bool;
fn connect(host: *const char , port: u64, clientId: u64 ) -> bool;
все эти ошибки удалены ... не очень хорошо разбираюсь в C++ или Rust, поэтому ... просто надеюсь, что кто-то может указать мне, как преобразовать это ... спасибо!
error[cxxbridge]: unsupported type: char
┌─ src/main.rs:15:33
│
15 │ fn connect(host: *const char , port: u64, clientId: u64 ) -> bool;
│ ^^^^ unsupported type
Подойдя поближе... кажется, он жалуется на pointer argument requires that the function be marked unsafe
#[cxx::bridge(namespace = "com::enserio")]
mod ffi {
unsafe extern "C++" {
include!("twsapi_grpc_server/include/twsapi-client.h");
include!("twsapi_grpc_server/include/AvailableAlgoParams.h");
include!("twsapi_grpc_server/include/AccountSummaryTags.h");
include!("twsapi_grpc_server/include/Utils.h");
type TWSApiClient;
fn new_twsapi_client() -> UniquePtr<TWSApiClient>;
fn init_connect(&self, host: *const c_char , port: i32, client_id: i32) -> bool;
}
}
error[cxxbridge]: pointer argument requires that the function be marked unsafe
┌─ src/main.rs:16:32
│
16 │ fn init_connect(&self, host: *const c_char , port: i32, client_id: i32) -> bool;
│ ^^^^^^^^^^^^^^^^^^^ pointer argument requires that the function be marked unsafe
@SergeyKolesnik Я обновил редактирование, чтобы указать дополнительную информацию.
char
в ржавчине это не то, что вам нужно (в ржавчине char — это символ юникода, а в C — один байт).
То, что вы хотите, это libc::c_char
.
use libc::c_char;
extern "C" fn connect(host: *const c_char , port: u64, clientId: u64 ) -> bool {
true
}
Однако я не уверен, что bool
в качестве возвращаемого типа будет работать надежно, я бы, вероятно, вернул тип с конкретным размером, например u32
.
libc::c_char
на самом деле core::ffi::c_char
, i8
на x86 (32, 64), поэтому const char*
это *const i8
в Rust
Я вижу pointer argument requires that the function be marked unsafe
.. хотя все это помечено как небезопасное .. обновлю пост
установив значение «закрыто». Я успешно заработал с вашей помощью И добавил несколько других исправлений … например, добавление unsafe
прямо к самому методу.
Обычно символы, экспортированные с помощью
extern "C"
, используются для вызова чего-либо из другого языка. Поскольку в вашем коде C++ естьpublic
, функция там является членом. В C нет функций-членов.