Próbuję zbudować funkcje Octave w Rust. API Octave'a znajduje się w C++, więc wygenerowałem wiązania za pomocą rust-bindgen. Aktualnie pracuję nad problemami, które występują podczas próby wygenerowania bindings that include std::string
. Byłoby miło, gdybym mógł pozostawić nieprzezroczysty i prawidłowy wskaźnik na C++ std::string
. Czy byłoby możliwe zbudowanie funkcji użyteczności po stronie C++ za każdym razem, gdy potrzebowałem przejść w C++ std::string
?Interakcja Rust z C++ std :: string
Byłem naiwny, kiedy po raz pierwszy spróbowałem tego. Jest to oczywiście błędne. Rdza std::ffi:CString
dotyczy ciągów C, a nie C++. Znalazłem this recent blog pomocne przy porównywaniu dwóch. Moja pierwsza próba wygląda like this:
#![allow(non_snake_case)]
#![allow(unused_variables)]
extern crate octh;
// https://thefullsnack.com/en/string-ffi-rust.html
use std::ffi::CString;
#[no_mangle]
pub unsafe extern "C" fn Ghelloworld (shl: *const octh::root::octave::dynamic_library, relative: bool) -> *mut octh::root::octave_dld_function {
let name = CString::new("helloworld").unwrap();
let pname = name.as_ptr() as *const octh::root::std::string;
std::mem::forget(pname);
let doc = CString::new("Hello World Help String").unwrap();
let pdoc = doc.as_ptr() as *const octh::root::std::string;
std::mem::forget(pdoc);
octh::root::octave_dld_function_create(Some(Fhelloworld), shl, pname, pdoc)
}
pub unsafe extern "C" fn Fhelloworld (args: *const octh::root::octave_value_list, nargout: ::std::os::raw::c_int) -> octh::root::octave_value_list {
let list_ptr = ::std::ptr::null_mut();
octh::root::octave_value_list_new(list_ptr);
::std::ptr::read(list_ptr)
}
muszę przechodzić w nazwie funkcji i dokumentacji jako ciągów octave_dld_function_create
. Szkoda, że nie było CppString
, którego mógłbym użyć zamiast tego. Wszelkie sugestie dotyczące postępowania?
C++ producenci kompilatorów/stdlib nie mają tego pojęcia; Nie oczekiwałbym Rusta. ; -] (Aby było jasne, 'std :: string' jest mandowanym interfejsem, a nie wymaganą implementacją, a jeśli chcesz przekazać _anything_ według wartości, musisz przynajmniej znać jego rozmiar/układ). – ildjarn
Próbuję na początku współpracować z GNU Octave na Ubuntu Linux. Kompilatorem jest gcc 6.3.0 z 'gcc -dumpversion', a stdlib to libstdC++. So.6 (libc6, x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 z' ldconfig -p | grep stdC++ '. https://stackoverflow.com/a/10355215/23059 –
Czy jest to z definicją lub bez '_GLIBCXX_USE_CXX11_ABI'? ;-] Point is being, jeśli nie został właściwie wyabstrahowany w C++ - narzędziach budowania, robienie tego gdzie indziej ma bardzo małą szansę. Na przykład.mój system ma dostępne libC++, libstdC++ i Dinkumware stdlibs. – ildjarn