digitalmars.D - Calling D libraries from C, _deh_beg madness and exception handling
- Nicolay Korslund <korslund gmail.com> Oct 29 2007
- Nicolay Korslund <korslund gmail.com> Oct 29 2007
- BCS <BCS pathlink.com> Oct 29 2007
- Nicolay Korslund <korslund gmail.com> Oct 30 2007
- "Jarrett Billingsley" <kb3ctd2 yahoo.com> Oct 29 2007
Hi, I'm having some problems making a D library and linking it to a C/C++ program. (The library is Monster, http://dsource.org/projects/monster.) I want the library to be as accessible to C++ users as possible, so I want to be able to distribute it as a static library and let users access the library though C function calls. I specifically do NOT want to force users to download a D compiler in order to use the library. I have created an init() function that initializes the GC and the likes (copied from internal/dmain2), but problems occur when linking - I get undefined references to _deh_beg and _deh_end. Googling around I found that this is a known problem (DMD inserts these symbols when it finds a main() function to set up exception handling), but I couldn't find a solution. I found that defining void* _deh_beg; void* _deh_end; in the C program makes the problem go away, but of course exceptions become horribly broken. Is there any way to make DMD insert the correct symbols without having a D main? Or can I set them up myself somehow? I don't even know what these pointers are supposed to point to. N
Oct 29 2007
Nicolay Korslund Wrote:Is there any way to make DMD insert the correct symbols without having a D main? Or can I set them up myself somehow? I don't even know what these pointers are supposed to point to.
Apparantly the solution was to add an empty main() function in D code somewhere. For some reason this did not create a conflict with the C main(), so now everything is peace and harmony. Let's just hope it doesn't suddenly stop working again at some point. N
Oct 29 2007
Nicolay Korslund wrote:Nicolay Korslund Wrote:Is there any way to make DMD insert the correct symbols without having a D main? Or can I set them up myself somehow? I don't even know what these pointers are supposed to point to.
Apparantly the solution was to add an empty main() function in D code somewhere. For some reason this did not create a conflict with the C main(), so now everything is peace and harmony. Let's just hope it doesn't suddenly stop working again at some point. N
IIRC there is an extern(C)main defined in phobos that calls the D main. because of the way that linkers work, the main in phobos gets cover up by just about anything that should get precedence. So while I'd still call you code a hack/workaround, I'd say it should keep working.
Oct 29 2007
BCS Wrote:IIRC there is an extern(C)main defined in phobos that calls the D main. because of the way that linkers work, the main in phobos gets cover up by just about anything that should get precedence. So while I'd still call you code a hack/workaround, I'd say it should keep working.
Ok, thanks, that's what I suspected. I think this should documented somewhere, since writing libraries is a pretty important feature and I'm not the first person to ask about it. The closest thing I could find on the website is a Windows DLL guide. I might write a cross-language library guide myself, but I have to play some more with it myself though.
Oct 30 2007
"Nicolay Korslund" <korslund gmail.com> wrote in message news:fg5nqc$27rn$1 digitalmars.com...Nicolay Korslund Wrote:Is there any way to make DMD insert the correct symbols without having a D main? Or can I set them up myself somehow? I don't even know what these pointers are supposed to point to.
Apparantly the solution was to add an empty main() function in D code somewhere. For some reason this did not create a conflict with the C main(), so now everything is peace and harmony. Let's just hope it doesn't suddenly stop working again at some point. N
The D main that you write gets converted to _Dmain, thus the symbols don't collide.
Oct 29 2007









Nicolay Korslund <korslund gmail.com> 