dynamic library building and loading
Jacob Carlborg
doob at me.com
Thu Sep 27 23:15:29 PDT 2012
On 2012-09-28 01:21, Rob T wrote:
> For me to get C or C++ to run a D function, I had to do the following:
>
> // ====================
> // C/C++ library source
> // ====================
>
> // sample D function from library
> void foo(int i, int j, int k);
> // D runtime initialization & shutdown
> void init();
> void done();
>
> void bar()
> {
> foo(6, 7, 8);
> }
>
> int main(int argc, char **argv)
> {
> init();
> bar();
> done();
> return 0;
> }
>
>
> // ================
> // D library source
> // ================
> import std.stdio;
> static import core.runtime;
>
> // sample D function for test
> extern (C++) // int foo(int i, int j, int k)
> void foo(int i, int j, int k)
> {
> writefln("i = %s", i);
> writefln("j = %s", j);
> writefln("k = %s", k);
> int t = i + j + k;
> writefln("Total = %s", t);
> }
>
> // Had to initialize and shutdown D system from C/C++.
> extern (C++) export void init() { // to be called once after loading
> shared lib
> core.runtime.Runtime.initialize();
> }
>
> extern (C++) export void done() { // to be called before unloading
> shared lib
> core.runtime.Runtime.terminate();
> }
>
>
> // I had to include main even though this is a library.
> int main()
> {
> return 0;
> }
That is not sufficient to have everything work. It might be ok if you
limit yourself to a C subset of D. On some platforms, calling
Runtime.initialize, will miss initializing some parts.
The implementation of the runtime initialization contains a lot of code
duplication and some functions/branches are missing functionality. Example:
https://github.com/D-Programming-Language/druntime/blob/master/src/rt/dmain2.d#L346
The C main function handles the runtime initialization for a regular
statically linked executable. If you initialize the runtime via
"rt_init", which is called by "Runtime.initialize", it will miss to
initialize some parts on some platforms. The C main function should
really call "rt_init" to remove the code duplication.
Also see this post why everything will not properly work:
http://forum.dlang.org/thread/k3vfm9$1tq$1@digitalmars.com?page=3#post-k4219f:24uft:241:40digitalmars.com
--
/Jacob Carlborg
More information about the Digitalmars-d
mailing list