2012-01-26 9 views
5

से emscripten संकलित सी लाइब्रेरी का उपयोग emscripten wiki पर दिए गए निर्देशों के बाद मैंने एक छोटी सी लाइब्रेरी संकलित करने में कामयाब रहा है। इसका परिणाम a.out.js फ़ाइल में हुआ।node.js

मैं इस पुस्तकालय (Node.js भीतर) से कुछ इस तरह कार्यों का उपयोग करने के लिए कि यह सोचते गया था काम किया है जाएगा:

var lib = require("./a.out.js"); 
lib.myFunction('test'); 

हालांकि इस विफल रहता है। क्या कोई मुझे इससे संबंधित कुछ बुनियादी ट्यूटोरियल में मदद या संकेत दे सकता है?

उत्तर

7

समस्या यहां है कि आपके a.out.js फ़ाइल इस

function myFunction() { 
    ... 
} 

की तरह लग रहे करने के लिए इस

function myFunction() { 
    ... 
} 

exports.myFunction = myFunction; 

आप एक निर्माण स्क्रिप्ट कि टोकन के लिए आप चाहते हैं सूचीबद्ध करता है लिखने की ज़रूरत चाहते नहीं जा रहा है है सार्वजनिक रूप से प्रत्येक सी प्रोग्राम से निर्यात करें और प्रत्येक टोकन के लिए अपनी फ़ाइल के अंत में exports.<token> = <token>;\n जोड़ता है।

+1

कुछ शोध करने के बाद मैं emscripten विकि पृष्ठ '[कोड के साथ बातचीत] पर समाधान (https://github.com/kripken/emscripten/wiki/Interacting-with-code) ', ** निर्यात का मिश्रण। ** ** पॉइंटर_स्ट्रिंगिफा ** और ** आवंटित ** कार्यों के साथ काम करता है – lostsource

+0

@lostsource क्या आप मुझे एक उदाहरण दिखा सकते हैं? – noamtcohen

6

असल में, सभी फ़ंक्शंस पहले से ही निर्यात किए जा चुके हैं।

var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; 
// … 

if (ENVIRONMENT_IS_NODE) { 
    // … 
    module['exports'] = Module; 
} 

आप मिल गया तो एक समारोह अपने सी कोड में my_fun कहा जाता है, तो आप Module._my_fun परिभाषित करना होगा: जनरेट किया गया जावास्क्रिप्ट निम्नलिखित लाइनों में शामिल है।

हालांकि, इस दृष्टिकोण के साथ कुछ समस्याएं हैं।

अनुकूलक कुछ कार्यों को हटा या नाम बदल सकता है, इसलिए हमेशा उन्हें -s EXPORTED_FUNCTIONS="['_main','_fun_one','_fun_two']" पास करने का निर्दिष्ट करें। सी ++ में फ़ंक्शन हस्ताक्षर थोड़ा उलझन में हैं, इसलिए extern "C" { … } जो आप निर्यात करना चाहते हैं, उनके लिए बुद्धिमान है।

इसके अलावा, इस तरह के प्रत्यक्ष दृष्टिकोण requires JS to C type conversions। आप फ़ाइल में अभी तक एक और एपीआई परत जोड़कर --pre-js विकल्प के साथ संलग्न जोड़ा द्वारा इसे छिपाने के लिए चाहते हो सकता है:

var Module = { 
    my_fun: function(some_arg) { 
    javascript to c conversion goes here; 
    Module._my_fun(converted_arg) // or with Module.ccall 
    } 
} 

Module वस्तु बाद में सभी Emscripten-उत्पन्न उपहार के साथ बढ़ती है, तो चिंता मत करो कि यह यहाँ परिभाषित किया है , बदला हुआ नहीं।

अंत में, आप निश्चित रूप से Embind पर विचार करना चाहते हैं जो Emscripten द्वारा प्रदान किए गए अच्छे जावास्क्रिप्ट एपीआई को उजागर करने के लिए एक तंत्र है। (सबसे नया fastcomp बैकएंड अक्षम करने की आवश्यकता है।)