2017-10-02 16 views
5

के साथ जंग इंटरऑप मैं जंग में ऑक्टव फ़ंक्शन बनाने की कोशिश कर रहा हूं। ऑक्टेव का एपीआई सी ++ में है, इसलिए मैंने जंग-बाइंडजेन का उपयोग करके बाइंडिंग जेनरेट की है। मैं वर्तमान में 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 था जिसे मैं इसके बजाय उपयोग कर सकता था। आगे बढ़ने के बारे में कोई सुझाव?

+0

सी ++ कंपाइलर/stdlib विक्रेताओं यह पता नहीं लगा है; मैं जंग की उम्मीद नहीं करता। ; -] (स्पष्ट होने के लिए, 'std :: string' एक अनिवार्य इंटरफ़ेस है, एक अनिवार्य कार्यान्वयन नहीं है, और यदि आप मूल्य से _anything_ पास करना चाहते हैं तो कम से कम अपने आकार/लेआउट को जानने की आवश्यकता है।) – ildjarn

+0

मैं कोशिश कर रहा हूं उबंटू लिनक्स पर जीएनयू ऑक्टेव के साथ शुरू करने के लिए शुरू करने के लिए। संकलक '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 –

+1

और क्या वह '_GLIBCXX_USE_CXX11_ABI 'के साथ या उसके बिना परिभाषित है? ; -] प्वाइंट होने पर, अगर इसे सी ++ में सही ढंग से सारणित नहीं किया गया है - बिल्डिंग टूल्स, तो कहीं और ऐसा करना बहुत पतला मौका है। जैसेमेरे सिस्टम में libC++, libstdC++, और डिनक्यूमवेयर stdlibs उपलब्ध हैं। – ildjarn

उत्तर

3

यह एक क्लासिक FFI मुद्दा है और समाधान एक "घंटे ग्लास" डिजाइन का उपयोग करने के लिए है: भाषा एक < => आम ABI < => भाषा बी

यह संभव हो सकता है निश्चित रूप से, करने के लिए बाइंडजेन विकसित करें ताकि यह ई + एबीआई को ईमानदारी से पुन: पेश कर सके, लेकिन व्यावहारिक रूप से इसे एक पूर्ण सी ++ कंपाइलर की आवश्यकता होगी जो शायद बहुत अधिक प्रयास है।

"घंटे-ग्लास" डिज़ाइन का उपयोग करके, कठिन एबीआई वाली प्रत्येक भाषा एक विशिष्ट प्रसिद्ध एबीआई में परिवर्तित करने के लिए अपने विशेष टूलचेन का उपयोग करती है। इस मामले में, यह सी ++ < => सी < => जंग होगा।

सी ++ एपीआई के चारों ओर एक सी रैपर लाइब्रेरी बनाने का एक संभावित समाधान है, और फिर उस पर बाइंडजेन का उपयोग करें। एलएलवीएम और क्लैंग परियोजनाएं यही करती हैं।

यह सबसे आसान समाधान है, और ऑक्टावो प्रोजेक्ट इस तरह के एक ऑक्टोवो-सी मुखौटा इन-पेड़ को एकीकृत करने के लिए तैयार हो सकता है (जो हमेशा अद्यतित होने की गारंटी देता है)।


एक अन्य समाधान bindgen के लिए एक सी ++ साथी पुस्तकालय है, जो आम सी (जैसे std::string के रूप में) ++ प्रकार के लिए एक सी ABI उपलब्ध कराने का ख्याल रखता है बनाने के लिए किया जाएगा। यह एक और अधिक कठिन प्रयास हो सकता है, खासकर जब से:

  • सी कोई जेनरिक, इस प्रकार सी ++ टेम्पलेट्स होने के लिए या तो बाहर के दायरे, या पूर्व instantiated टेम्पलेट्स एक समय में एक लपेटा करना होगा होता है ,
  • सी चाल आह्वान या कंस्ट्रक्टर्स नकल है, इसलिए जब तक सी ++ प्रकार पहले से ही फली रहे हैं, वे अपारदर्शी संकेत के माध्यम से हेरफेर किया जा करने के लिए कैसे पता नहीं है,
  • सी पता नहीं है ...
संबंधित मुद्दे