On Wednesday, 8 November 2023 at 11:48:58 UTC, BoQsc wrote:
I would like to export some functionality as external shared dynamically linked D library.

Is it possible to do that in D Language and what are limitations?

A simple `writeln` example would be great.

What I expect is an executable that uses functions, variables, classes, modules from compiled external shared D dynamic library.

Example of shared dynamic libraries depending on other shared dynamic libraries would be great as well.

For a complete reference, check: https://wiki.dlang.org/Win32_DLLs_in_D

Create a dub project.
Set its targetType to `dynamicLibrary`.


Now, create a function:
```d
module dllmodule;

version(Windows)
{
    import core.sys.windows.dll;
    mixin SimpleDllMain;
}

export extern(C) void helloWorld()
{
    import std.stdio;
    writeln("DLL: Hello World");
}
```

Now, when you enter `dub`, you'll get a .dll on windows, and a .so on linux.
You can use any compiler of your preference.


Now, whenever you need to load this dll, you'll need to call:

```d
module my_app;

extern(C) void function helloWorld();

void main()
{
    import core.runtime;
    void* dllmodule = Runtime.loadLibrary("dllmodule.dll");
    version(Windows)
    {
        import core.sys.windows.dll;
helloWorld = cast(typeof(helloWorld))GetProcAddress(dllmodule, "helloWorld");
    }
    else version(Posix)
    {
        import core.sys.posix.dlfcn;
helloWorld = cast(typeof(helloWorld))dlsym(dllmodule, "helloWorld");
    }
    helloWorld();
}
```

With that, there it is.
You also may need to call `core.runtime.rt_init()` if you're not calling from D

Reply via email to