2017-07-17 10 views
9

मान लीजिए मैं एक साधारण, आत्म निहित सी ++ फ़ाइल (math.cpp) इस तरह है:मैं WebAssembly पर एक सी ++ फ़ाइल कैसे संकलित करूं?

int add(int x, int y) { 
    return x + y; 
} 

मैं इसे कैसे WebAssembly (math.wasm) को संकलित हैं?

नोट: मैं क्लैंग टूल-चेन का उपयोग कर रहा हूं।

+1

हमें बताएं कि क्या आप इसे प्रबंधित कर सकते हैं, क्योंकि इसमें कई कदम शामिल हैं, और उन्हें सभी की आवश्यकता है बहुत सारे बड़े डाउनलोड और विन्यास। वेब असेंबली वास्तव में रोमांचक लगता है लेकिन मैं यह नहीं कह सकता कि मैं रोमांचित हूं जब मैं कोशिश करने में हर समय गिनता हूं और थोड़ा आगे नहीं बढ़ता। मैं अब इसके बारे में बहुत उत्साहित नहीं हूं। – jokoon

उत्तर

8

मुझे this gist बहुत उपयोगी होने के लिए मिला।

  1. (LLVM और बजना 5.0.0 या -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=WebAssembly के साथ ऊपर का निर्माण)
  2. बजना साथ LLVM bitcode को सीपीपी soure संकलित करें:

    clang -emit-llvm --target=wasm32 -Oz math.cpp -c -o math.bc

    असल में, इस कदम हैं

  3. एस-असेंबली में बिटकोड संकलित करें:

    :llc -asm-verbose=false -o math.s math.bc

  4. उपयोग binaryen शाब्दिक द्विआधारी .wasm में .wast फ़ाइल का अनुवाद करने में रों wast2wasm उपकरण के s2wasm एक .wast फ़ाइल

    s2wasm math.s > math.wast

  5. उपयोग WABT बनाने के लिए उपकरण '

    wast2wasm -o math.wasm math.wast

कुछ कदम अनावश्यक महसूस करते हैं लेकिन मुझे अभी तक कोई टूल नहीं मिला है जो शॉर्टकट को अनुमति देता है। (यह अच्छा होगा अगर llc सीधे .wasm को संकलित कर सकता है, या यदि s2wasm वास्तव में बाइनरी .wasm फ़ाइलों को नाम के रूप में दिखाता है।) वैसे भी, एक बार जब आप टूलचैन चलाते हैं तो यह अपेक्षाकृत दर्द रहित होता है। नोट, हालांकि, वेब असेंबली के लिए अभी तक कोई सी या सी ++ मानक पुस्तकालय नहीं हैं।

वैकल्पिक रूप से, अगर आपको सामान की कोशिश करने के लिए .wasm फ़ाइल की आवश्यकता है तो आप सभी टूलचैन परेशानी के बिना दूर हो सकते हैं। https://mbebenita.github.io/WasmExplorer/, paste in your C/C++ code पर ब्राउज़ करें, और संकलित .wasm फ़ाइल डाउनलोड करें।

+1

दरअसल, जैसा कि गिस्ट में टिप्पणियों का सुझाव है कि आप बाइनरीन को छोड़ सकते हैं और सीधे क्लैंग/एलएलवीएम से संकलित कर सकते हैं। मैं वर्तमान में सी ++ के लिए निम्न कमांड लाइन का उपयोग कर रहा हूं: 'clang ++ test.cpp -ObjC++ --compile --target = wasm32-अज्ञात-अज्ञात-wasm --optimize = 3 --output test.wasm' – noontz

+0

@noontz उह, अच्छा .. ऐसा लगता है कि सभी के बाद जिस्ट टिप्पणियां पढ़ने के लायक हैं;) अगर मैं स्वतंत्र रूप से इस काम की पुष्टि कर सकता हूं (या मैं इसे आजमाने में सफल हूं) तो मैं इसे उत्तर में संपादित कर दूंगा। – kazemakase

1

वर्तमान में सी और सी ++ संकलित करने का सबसे आसान तरीका emscripten के साथ है। जिन घटकों का आप उल्लेख करते हैं वे सभी घटक हैं, लेकिन ईएमएसस्क्रिप्ट एक पूर्ण टूलचेन है जो अंत तक निर्माण का समर्थन करता है, और इसमें आपके द्वारा आवश्यक सभी भागों को शामिल किया गया है जिनमें libc/libC++, और कई अन्य उपयोगी पुस्तकालय शामिल हैं। यह asm.js और wasm दोनों को लक्षित करने का समर्थन करता है।

+1

यह सामान्य रूप से एक अच्छी सलाह है - ईएमएसस्क्रिप्ट का उपयोग करके निर्माण करना बहुत आसान है - लेकिन इस सवाल के लिए बिल्कुल नहीं। Emscripten पहले चरणों की तुलना में बड़ी फ़ाइल के आयाम के आदेश बनाएगा –

0

इस उत्तर के लिए थोड़ा देर हो चुकी है लेकिन आपकी स्क्रिप्ट को संकलित करने के लिए ऑनलाइन सुंदर उपकरण हैं।

उदाहरण के लिए, मैं इसका उपयोग कर रहा हूं। वह आपको संकलन (सी, सी ++, std99 ...) के न्यूनतम विकल्प प्रदान करता है लेकिन वहां पर्याप्त हैं: https://wasdk.github.io/WasmFiddle/

और आप इसका उपयोग कैसे करेंगे इसके आधार पर, आप x86, कोड बफर जैसे differents भाषाओं के बीच चयन कर सकते हैं।जब आप किसी अन्य दोस्त के साथ काम कर रहे हों तो आप अपने कोड, प्रकार के कार्यों को भी साझा कर सकते हैं: https://wasdk.github.io/WasmFiddle/?gus9d :)

संबंधित मुद्दे