On Saturday, 24 August 2019 at 01:19:01 UTC, H. S. Teoh wrote:
Not sure what's the "right" approach, but you could try compiling with dmd -v to find the path(s) to the runtime libraries that you'll need to link.
Oh, cool, I managed to find them on my current system. I would love a more portable solution though. This should work for now.
Keep in mind that before calling any non-trivial D code (i.e., that uses the GC or any druntime function, including language hooks) you need to call core.runtime.rt_init first. And preferably at shutdown call core.runtime.rt_term to cleanup.
Yup.
Not sure what will happen if more than one D library does this, though. My guess is that you'll somehow need to get them all to link to (or otherwise be aware of) a single instance of the D runtime, otherwise you might get some weird runtime behaviour when the two runtimes conflict with each other.
I should only be executing the code from one place so it should not be a problem. But `rt_init` and `rt_term` are just C bindings[1] to `core.runtime.Runtime.initialize`[2] and `core.runtime.Runtime.terminate` which state that "Each call to initialize must be paired by a call to terminate."
[1] https://github.com/dlang/druntime/blob/master/src/core/runtime.d#L30
[2] https://dlang.org/phobos/core_runtime.html#.Runtime.initialize