I want to create a Dynamic library (cross-platform) in D, so I did some Googling. After some time I found this page. I am absolutely stunned by how much complexities there are in writing, compiling and even linking to a DLL. Isn't there a uniform way of creating a shared library like you would in C? (just leave out the main function and pass some flags to the linker)
How to create a Dynamic Library in D?
3k Views Asked by Jeroen At
1
There are 1 best solutions below
Related Questions in DLL
- C++ using std::vector across boundaries
- Linking to a static lib compiled with MSVC
- What are MATLAB DLLS?
- VC++ .net: Functionality from managed DLL is not exported
- DLL being marked as DELETEPENDING
- ASP.NET Web Forms give error while connecting to Oracle 11g
- Air Native Extensions: Released Air App w/Windows Native Extension works fine on develpment PC but not on other computers
- WiX and custom extensions for primary output?
- Using different versions of the same DLL in a project
- visual c++ - missing unrelated DLLs
- Error executing SSIS Package
- C++ Access violation write to 0x00000000 in dll in mql4
- How can I read embedded .resx in different assembly
- Running two versions of same Dll parallel in Asp.Net
- Call class member of c++ DLL from c#
Related Questions in D
- How to compile D and C *.o files with GCC
- Force the terminal output buffer to flush
- How do you pass parameters to the constructor when creating an anonymous class in D
- DMD looking for random file on disk when linking
- How to fix D "memory leaks"
- Executing std.process synchronously from vibe.d sometimes silently hangs the server
- Pure constructors in class templates
- What does it mean that the D garbage collector is "not guaranteed to run the destructor for all unreferenced objects"?
- Execute compile time-compiled regex at compile time
- Windows SCSI ReadCapacity16 in D
- Is there method like python popitem for associative arrays in dlang?
- Formatting a string in D
- How to handle no command-line arguments in D?
- Using D language binding for Xamarin Studio on Mac
- Embeddable Common Lisp (ECL) with D Programming Language?
Related Questions in DYNAMIC-LIBRARY
- Name of Python dynamic library module different than file name
- xCode produces "Undefined symbols for architecture x86_64" error while gcc compiles without errors
- Ada Encapsulated Library Project GNAT
- dll that needs other dll and it's called from a third party
- loading shared library into shared memory
- Why do we use use_frameworks! in CocoaPods?
- Link Binary with libraries VS Embed Frameworks
- How to create a Dynamic Library in D?
- When we define functions in a program, do they get stored in the standard library?
- Android intent activity in external lib
- VS2017 doesn't copy Additional Include Directories to remote env (linux) causing compilation error
- C++: What to recompile when an inline function in a dynamic library changes?
- Creating a generic binary in linux for all x86 machines
- Destroying threads in Openmp (C++)
- how to send js library to client dynamically?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Well, I decided to spend some time today messing with this and I kinda sorta have something that works, at least if the main program is also written in D (on Linux, I think it will work from C too on Windows. The reason is I didn't link to phobos in the .so in the D one, so it relies upon the exe for those symbols. I think, tbh I don't know exactly what is going on here, maybe it would work better if I used the shared phobos lib too)
Anyway, first, let's throw some code down.
This is testdll.d and it builds our dll
You'll notice most that code is the WinMain which just calls druntime functions. I think that main should be available at least as a mixin, or maybe even fully automatic, since it is pure boilerplate.
And the client code:
This has different code for Windows and Linux, though it is pretty similar. The druntime stuff is supposed to start taking care of this soon as we mentioned in the comments.
The compile commands aren't too bad but a little weird. Linux first:
PIC and shared tell it to build the .so. I did the blank defaultlib because without it, loading the dll at runtime failed with "symbol already defined" errors.
Building the client is straightforward:
Note that there's the pragma(lib) in the file that links with the -ldl option automatically. Run it and get some hello! BTW be sure both are in the same directory since this loads ./ in the loader.
Now, let's build on Windows.
Tell it to output our dll, use -shared so it knows, and then the other thing is the def file, like described here http://dlang.org/dll.html/dllmain
These are the contents of that file:
If you don't use the .def file, the dll will build successfully, but the procedure won't be found because it isn't exported. (I think the export keyword in D should be able to do this automatically, bypassing hte .def file, and I believe there's a discussion on doing this, but right now it is required as far as I know.)
And the client is similarly easy:
Run it and get some hellos, if all goes well.
Now, why did I do the functype alias in the client? Easier than doing the other casting and such, and it makes it nicely extern(C).
Why is the lol function extern(C) in the first place? Just so it has an easier name to use in GetProcAddress/dlsym. Could have also pragma(mangle) or did .mangleof with an import thing. All kinds of options there, fairly straightforward, I just wanted to keep it simple to make the test easier to focus on. "lol" is a simpler name than "_D7testdll3lolFZv" or whatever the mangled name would be.... (OMG I mangled it correctly by hand! Sometimes I think I write too much D lol) and yeah that works too it is just harder to do by eyeball. Note: on Windows, the .def file might have to leave off the leading underscore if you do it that way.
anyway, yeah, this made a working dll/so for me and a program to load and use it successfully. Not as pretty as it could/should be, but it works. For me at least.