But it's not a bug. As I said, you just need to add "C" to your `extern`, because right now you're exposing it from Rust via C FFI, but declaring it as a C++ symbol on the other side.
On Thu, 27 Jan 2022 at 02:32, Александр Гурьянов <[email protected]> wrote: > Filled this bug: > https://github.com/emscripten-core/emscripten/issues/16123 > > чт, 27 янв. 2022 г. в 02:42, 'Ingvar Stepanyan' via emscripten-discuss < > [email protected]>: > >> I think it should be `extern *"C"* int32_t rv_api_1;` on the C++ side, >> otherwise normal mangling rules apply and it's looking up (or, this case, >> declaring) a namespaced variable. >> >> On Wednesday, 26 January 2022 at 19:31:18 UTC [email protected] wrote: >> >>> Is it valid to simply do `extern int32_t rv_api_1;` in C to refer to a >>> rust variable? Does that address of `rv_api_1` on the C side look correct? >>> >>> Does `pub static rv_api_1: i32 = 1;` in rust generate a static >>> initializer function or is it simply static memory (like it would be in >>> C/C++)? >>> >>> Assuming it is generating a ctor then there are a couple of things that >>> could be going on. Are you sure your static ctors have been run? i.e. >>> where is your code running? Is it inside of main? Disassembling your >>> final binary should show all static ctors being called from the >>> `__wasm_call_ctors` function. >>> >>> cheers, >>> sam >>> >>> >>> On Wed, Jan 26, 2022 at 10:24 AM Александр Гурьянов <[email protected]> >>> wrote: >>> >>>> Okay, I think I almost did the same in Rust what Alon described. >>>> vanger-rs now compiles as static library (.a) with emscripten triple. I use >>>> this static library to link with original C++ game. So I have *.o files >>>> from vangers, and librusty_vangers.a (which provides rendering on wgpu). I >>>> link them with emcc, and it produce wasm without any error! >>>> >>>> Also I do the same with native build - it works fine. >>>> >>>> However, when I tries to run it fails with assertion. >>>> >>>> On RUST side I have the following code: >>>> #[no_mangle] >>>> pub static rv_api_1: i32 = 1; >>>> >>>> On C++ side I have the following code: >>>> extern int32_t rv_api_1; >>>> // ... >>>> if(rv_api_1 != 1){ >>>> printf("Invalid libvangers_ffi version expected 1, actual >>>> %d\n", rv_api_1); >>>> // abort(); >>>> } >>>> >>>> When I run it, I have following output: >>>> Invalid libvangers_ffi version expected 1, actual 0 >>>> >>>> For me it looks like static initializer from RUST didn't run. Because >>>> if I comment the abort(); seems integration works fine. Native build works >>>> correctly... >>>> Do you have any idea why so? >>>> >>>> ср, 19 янв. 2022 г. в 00:36, Alon Zakai <[email protected]>: >>>> >>>>> >>>>> >>>>> On Fri, Jan 14, 2022 at 11:08 AM Александр Гурьянов <[email protected]> >>>>> wrote: >>>>> >>>>>> Let's look closer to my case. I ported C++ game Vangers to the web ( >>>>>> https://www.gamepix.com/play/vangers). Vangers community did big >>>>>> work to integrate vange-rs (rust 3d render, based on wgpu) and Vangers >>>>>> game. It works as follow: >>>>>> 1. Vange-rs provide c ffi interface >>>>>> 2. Vange-rs compiled with rust to static library >>>>>> 3. Vangers linked with Vanger-rs to executable >>>>>> >>>>>> Now I want to port vangers + (vange-rs render) to the web. wgpu >>>>>> didn't support wasm32-unknown-emscripten, I added experimental support >>>>>> for >>>>>> emscripten and it works. BUT, wgpu is developing to fast, so my changes >>>>>> become outdated very fast :) >>>>>> >>>>>> When I implement support for emscripten, I only disabling >>>>>> wasm32-unknown rules and uses native code paths everywhere. So, it's >>>>>> little >>>>>> bit strange, to work with emscripten you need to disable workarounds for >>>>>> wasm32. emscripten emulates native platform, so code that correctly uses >>>>>> posix system should work also in emscripten. >>>>>> >>>>>> Maybe there is any way to just use native static library and link it >>>>>> with emscripten? Like this: >>>>>> 1. Compile vange-rs static library (with native triple) >>>>>> 2. Compile vangers project with emscripten >>>>>> 3. Link 1+2 with emscripten >>>>>> >>>>>> >>>>> (1) would compile to x86, though, I think? We have to have wasm to >>>>> link with emscripten. >>>>> >>>>> >>>>>> for (1.) I can't use emscripten triple because of #[cfg] rules for >>>>>> wasm32 target, they select wrong code path (non-native). >>>>>> >>>>>> >>>>> Hmm, I don't know enough rust to know what fixing that would mean... >>>>> >>>>> Overall for an emscripten port I think we would want to use a native >>>>> build as much as possible? That is, ideally you would *not* use >>>>> vange-rs/WebGPU, but one of the native rendering paths (OpenGL of some >>>>> flavor? Or perhaps they have Dawn/WebGPU support?). And you would need to >>>>> tell rust to use the emscripten triple while doing so. >>>>> >>>>> That should work, in theory. If it doesn't and Rust has some issues >>>>> with how it invokes emcc to link, then the workaround could be what I >>>>> mentioned for Zig and C before: get Rust to link to a static library, and >>>>> then run emcc manually on that. >>>>> >>>>> (Alternatively, in theory someone could look into supporting >>>>> wasm-bindgen + emscripten.) >>>>> >>>>> - Alon >>>>> >>>>> >>>>>> пт, 14 янв. 2022 г. в 07:54, Alon Zakai <[email protected]>: >>>>>> >>>>>>> Thanks, good to know at least 2 people would read a post about this >>>>>>> :) I'll try to find time for it. >>>>>>> >>>>>>> About Rust, I haven't had time to look into it yet. My general hope >>>>>>> is that the same model as for C and Zig could work: >>>>>>> >>>>>>> 1. Tell Rust to use the emscripten wasm triple. >>>>>>> 2. Tell Rust to compile to object files (or a static library, >>>>>>> basically), and *not* to link them. >>>>>>> 3. The user runs emcc on those object files, linking them. >>>>>>> >>>>>>> The nice thing in this model is that C/Zig/Rust does not need to be >>>>>>> aware of emcc at all here (aside from telling LLVM to use the emscripten >>>>>>> triple). And it's easy to do this, at least in C and Zig (although there >>>>>>> are some subtle ABI questions). >>>>>>> >>>>>>> This is actually the main thing I wanted to do before writing the >>>>>>> post - ideally I'd have a Rust demo alongside C and Zig - so if someone >>>>>>> figures that out, let me know! >>>>>>> >>>>>>> - Alon >>>>>>> >>>>>>> >>>>>>> On Thu, Jan 13, 2022 at 2:06 AM Александр Гурьянов < >>>>>>> [email protected]> wrote: >>>>>>> >>>>>>>> +1 for blog post. Not clear how I can use it with rust, e.g. can I >>>>>>>> compile static lib with target --wasm32-unknown-unknown and then link >>>>>>>> using >>>>>>>> emscripten? The main problem with RUST is that it even can't compile >>>>>>>> with >>>>>>>> --wasm32-unknown-emscipten (because of lib dependencies that not >>>>>>>> support >>>>>>>> emscripten) >>>>>>>> >>>>>>>> чт, 13 янв. 2022 г. в 16:46, Floh <[email protected]>: >>>>>>>> >>>>>>>>> That's a very useful gist, Alon! I think that blog post would be >>>>>>>>> much appreciated by a lot of people who like to tinker with other >>>>>>>>> languages >>>>>>>>> :) >>>>>>>>> >>>>>>>>> On Wednesday, 12 January 2022 at 19:32:04 UTC+1 [email protected] >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> On Sat, Dec 25, 2021 at 6:02 AM Floh <[email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> Ah, language and toolchain interoperability, one of my favourite >>>>>>>>>>> topics ;) >>>>>>>>>>> >>>>>>>>>>> Zig has nearly the same problems as Rust: it allows to compile >>>>>>>>>>> to WASM, it has both a WASI and Emscripten target, with the WASI >>>>>>>>>>> target >>>>>>>>>>> working out of the box, but I gave up on the Emscripten target >>>>>>>>>>> because I >>>>>>>>>>> just couldn't get it to work. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> I wrote up a demo of Zig + Emscripten here: >>>>>>>>>> >>>>>>>>>> https://gist.github.com/kripken/58c0e640227fe5bac9e7b30100a2a1d3 >>>>>>>>>> >>>>>>>>>> That uses GLES3 and Asyncify from Emscripten, so it's a small >>>>>>>>>> program but it uses interesting features. >>>>>>>>>> >>>>>>>>>> The gist also shows using C in the same way, where Emscripten is >>>>>>>>>> just the linker, not the frontend. >>>>>>>>>> >>>>>>>>>> I've been meaning to do the same with Rust and write a blogpost >>>>>>>>>> about all 3 but haven't found the time... >>>>>>>>>> >>>>>>>>>> - Alon >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> IMHO it would be great if the Javascript shims and interop could >>>>>>>>>>> be somehow split out of the Emscripten SDK into a separate, smaller >>>>>>>>>>> "webapi-wasm-tools" SDK which could be better integrated with other >>>>>>>>>>> language toolchains. The goal should be that other programming >>>>>>>>>>> languages >>>>>>>>>>> can benefit from the work that went into the Emscripten SDK to >>>>>>>>>>> access web >>>>>>>>>>> APIs like WebGL, WebGPU, WebAudio etc... up to "EM_JS()" >>>>>>>>>>> functionality, >>>>>>>>>>> instead of having to duplicate this work, or requiring a separate >>>>>>>>>>> installation of the whole Emscripten SDK. >>>>>>>>>>> >>>>>>>>>>> There's a very promising project >>>>>>>>>>> https://github.com/schellingb/wajic by Bernhard Schelling which >>>>>>>>>>> has the same goals and which was used to port Mattias Gustavsson's >>>>>>>>>>> DOS-like >>>>>>>>>>> library to the web: https://mattiasgustavsson.com/wasm/ >>>>>>>>>>> >>>>>>>>>>> Anyway... just my 2 cents :) >>>>>>>>>>> -Floh. >>>>>>>>>>> On Friday, 24 December 2021 at 15:16:23 UTC+1 caiiiycuk wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi! Just want to share my experiment with using Rust and >>>>>>>>>>>> WebAssembly. I tried to port Vange-rs project (rust + wgpu) to >>>>>>>>>>>> browser. I >>>>>>>>>>>> used emscripten and unknown platforms. Both finally works, but >>>>>>>>>>>> have lot of >>>>>>>>>>>> obstacles. I am very sad about support level of emscripten in >>>>>>>>>>>> Rust, hope it >>>>>>>>>>>> will change at some day. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> https://caiiiycuk.medium.com/vange-rs-webassembly-in-rust-498e2f960a04 >>>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> >>>>>>>>>> You received this message because you are subscribed to the >>>>>>>>>>> Google Groups "emscripten-discuss" group. >>>>>>>>>>> To unsubscribe from this group and stop receiving emails from >>>>>>>>>>> it, send an email to [email protected]. >>>>>>>>>>> >>>>>>>>>> To view this discussion on the web visit >>>>>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/99cc45ea-2307-4551-94b8-ecff9ad965a0n%40googlegroups.com >>>>>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/99cc45ea-2307-4551-94b8-ecff9ad965a0n%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>>>>> . >>>>>>>>>>> >>>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "emscripten-discuss" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to [email protected]. >>>>>>>>> To view this discussion on the web visit >>>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/9e88b4b5-f110-4d90-a630-1c282a1febffn%40googlegroups.com >>>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/9e88b4b5-f110-4d90-a630-1c282a1febffn%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>>>>> . >>>>>>>>> >>>>>>>> -- >>>>>>>> You received this message because you are subscribed to the Google >>>>>>>> Groups "emscripten-discuss" group. >>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>> send an email to [email protected]. >>>>>>>> To view this discussion on the web visit >>>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVFgNcSPR-KFe35yg%2BU9NXFpG7U_Y5G0APbkZRf5UM2%2B8w%40mail.gmail.com >>>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVFgNcSPR-KFe35yg%2BU9NXFpG7U_Y5G0APbkZRf5UM2%2B8w%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>>> . >>>>>>>> >>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "emscripten-discuss" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to [email protected]. >>>>>>> To view this discussion on the web visit >>>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpRH1%2BxWEaTbjTvnk5kE5W4XwUjHefP8g1psk-pUvxVAtg%40mail.gmail.com >>>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpRH1%2BxWEaTbjTvnk5kE5W4XwUjHefP8g1psk-pUvxVAtg%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>>> . >>>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "emscripten-discuss" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEBtYrS_8fFYz9fmWoQNUwWqjXah%2B9f0cdZ4Jjd2%2BxVGQ%40mail.gmail.com >>>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEBtYrS_8fFYz9fmWoQNUwWqjXah%2B9f0cdZ4Jjd2%2BxVGQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "emscripten-discuss" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpTmf%3DjhApcxA%3DoW6G_eOTDLLwyPyJbduWQnJqWBQj8EqA%40mail.gmail.com >>>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAEX4NpTmf%3DjhApcxA%3DoW6G_eOTDLLwyPyJbduWQnJqWBQj8EqA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "emscripten-discuss" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> >>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEOxJmiieN552iJW2M7SQK9kOoQTu8--iVNQFmB8rCz_w%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVEOxJmiieN552iJW2M7SQK9kOoQTu8--iVNQFmB8rCz_w%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>> -- >> You received this message because you are subscribed to the Google Groups >> "emscripten-discuss" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/emscripten-discuss/3b1ec71f-be17-4c3e-b74a-69a7ba867e42n%40googlegroups.com >> <https://groups.google.com/d/msgid/emscripten-discuss/3b1ec71f-be17-4c3e-b74a-69a7ba867e42n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- > You received this message because you are subscribed to the Google Groups > "emscripten-discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To view this discussion on the web visit > https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVGN0%2Bd%3DN-%2BRHs%3Dj-Hc3c-cu%3D4VRNTsY4zGiR6q2p4xBGQ%40mail.gmail.com > <https://groups.google.com/d/msgid/emscripten-discuss/CAKOm%3DVGN0%2Bd%3DN-%2BRHs%3Dj-Hc3c-cu%3D4VRNTsY4zGiR6q2p4xBGQ%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- Regards, Ingvar. -- You received this message because you are subscribed to the Google Groups "emscripten-discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/emscripten-discuss/CADdUJT8qNOaBN2eS9i6grK%2BgNP9dp3pye_H7NRy2bVAaqxRGwQ%40mail.gmail.com.
