के साथ जंग इंटरऑप मैं जंग में ऑक्टव फ़ंक्शन बनाने की कोशिश कर रहा हूं। ऑक्टेव का एपीआई सी ++ में है, इसलिए मैंने जंग-बाइंडजेन का उपयोग करके बाइंडिंग जेनरेट की है। मैं वर्तमान में bindings that include std::string
उत्पन्न करने का प्रयास करते समय उत्पन्न होने वाली समस्याओं के माध्यम से काम कर रहा हूं। यह अच्छा होगा अगर मैं इसे C++ std::string
पर अपारदर्शी और मान्य सूचक छोड़ सकता हूं। किसी भी समय मुझे C++ std::string
में पास करने की आवश्यकता होने पर सी ++ पक्ष पर उपयोगिता फ़ंक्शन बनाना संभव होगा?सी ++ std :: स्ट्रिंग
जब मैंने पहली बार इसका प्रयास किया तो मैं मूर्ख था। यह स्पष्ट रूप से गलत है। एक जंग std::ffi:CString
सी तारों के लिए है, सी ++ तार नहीं। मैंने दोनों की तुलना करते समय this recent blog सहायक पाया। मेरा पहला प्रयास 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)
}
मैं तारों के रूप में octave_dld_function_create
को समारोह नाम और दस्तावेज में पारित करने के लिए की जरूरत है। मेरी इच्छा है कि CppString
था जिसे मैं इसके बजाय उपयोग कर सकता था। आगे बढ़ने के बारे में कोई सुझाव?
सी ++ कंपाइलर/stdlib विक्रेताओं यह पता नहीं लगा है; मैं जंग की उम्मीद नहीं करता। ; -] (स्पष्ट होने के लिए, 'std :: string' एक अनिवार्य इंटरफ़ेस है, एक अनिवार्य कार्यान्वयन नहीं है, और यदि आप मूल्य से _anything_ पास करना चाहते हैं तो कम से कम अपने आकार/लेआउट को जानने की आवश्यकता है।) – ildjarn
मैं कोशिश कर रहा हूं उबंटू लिनक्स पर जीएनयू ऑक्टेव के साथ शुरू करने के लिए शुरू करने के लिए। संकलक 'gcc -dumpversion' से gcc 6.3.0 है और stdlib libstdC++ है। So.6 (libc6, x86-64) => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 'ldconfig से -पी | grep stdC++ '। https://stackoverflow.com/a/10355215/23059 –
और क्या वह '_GLIBCXX_USE_CXX11_ABI 'के साथ या उसके बिना परिभाषित है? ; -] प्वाइंट होने पर, अगर इसे सी ++ में सही ढंग से सारणित नहीं किया गया है - बिल्डिंग टूल्स, तो कहीं और ऐसा करना बहुत पतला मौका है। जैसेमेरे सिस्टम में libC++, libstdC++, और डिनक्यूमवेयर stdlibs उपलब्ध हैं। – ildjarn