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