prolog and epilog code

Rufus Smith via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Aug 2 11:25:21 PDT 2016


On Tuesday, 2 August 2016 at 17:25:21 UTC, Steven Schveighoffer 
wrote:
> On 8/2/16 1:04 PM, Rufus Smith wrote:
>> On Tuesday, 2 August 2016 at 16:30:08 UTC, Adam D. Ruppe wrote:
>>> On Tuesday, 2 August 2016 at 16:21:07 UTC, Rufus Smith wrote:
>>>> How does one use C main? extern C?
>>>
>>> extern(C) int main()
>>>
>>> should do it
>>
>> It doesn't seem to be that easy!
>>
>> https://wiki.dlang.org/Runtime_internals
>
> This is just explaining how the runtime currently works, not 
> how you should override it.
>
> It's really easy actually. Example:
>
> $ cat main.c
> #include <stdio.h>
>
> extern int rt_init();
> extern void d_func();
> int main(int argc, char *argv[])
> {
>     printf("hello from C!\n");
>     rt_init();
>     printf("done initializing runtime\n");
>     d_func();
> }
> $ cat dmain.d
> extern(C) void d_func()
> {
>     import std.stdio;
>     writeln("hello from D!");
> }
>
> shared static this()
> {
>     import std.stdio;
>     writeln("doing some pre-run init!");
> }
> $ gcc -c main.c
> $ dmd dmain.d main.o
> $ ./dmain
> hello from C!
> doing some pre-run init!
> done initializing runtime
> hello from D!
>
> -Steve

When I do this in my project and try to link in the lib or obj 
created from the C project, I get "entry point must be defined" 
error. I tried to add both to the "command line".

If I don't have a main function in D, I get all kinds of 
unresolved externals. Not sure why, but it seems to not import in 
the runtime when there is no main defined.

Basically I created a side C++ project, copied your code in to 
the main.cpp. I then added the obj file to the linker command 
line path. Then I get the missing entry point error. It is very 
similar to yours, just using VisualD and windows.

Seems like it would be easier just to create a wrapper process 
and use shared memory to transfer data between them ;/

For example, if I just create a new D project. Add a new cpp file 
and paste your C code in, paste the D code in the empty D file, 
and try to compile, I get:

main.cpp
main.obj : error LNK2019: unresolved external symbol "int __cdecl 
rt_init(void)" (?rt_init@@YAHXZ) referenced in function main
main.obj : error LNK2019: unresolved external symbol "void 
__cdecl d_func(void)" (?d_func@@YAXXZ) referenced in function main
CMain.obj : error LNK2001: unresolved external symbol 
_D14TypeInfo_Const6__vtblZ
CMain.obj : error LNK2019: unresolved external symbol _d_throwc 
referenced in function 
_D3std9exception143__T12errnoEnforceTiVAyaa54_423a5c444c616e675c646d64325c77696e646f77735c62696e5c2e2e5c2e2e5c7372635c70686f626f735c7374645c737464696f2e64Vmi2543Z12errnoEnforceFNfiLAyaZi (@safe int std.exception.errnoEnforce!(int, "dmd2\windows\bin\..\..\src\phobos\std\stdio.d", 2543uL).errnoEnforce(int, lazy immutable(char)[]))
CMain.obj : error LNK2001: unresolved external symbol 
_D12TypeInfo_Aya6__initZ
CMain.obj : error LNK2019: unresolved external symbol 
_D3std3utf12isValidDcharFNaNbNiNfwZb referenced in function 
_D3std5stdio4File17LockingTextWriter10__T3putTwZ3putMFNbNiNfwZv
CMain.obj : error LNK2019: unresolved external symbol 
_D3std9exception14ErrnoException6__ctorMFNeAyaAyamZC3std9exception14ErrnoException (@trusted std.exception.ErrnoException std.exception.ErrnoException.__ctor(immutable(char)[], immutable(char)[], ulong)) referenced in function _D3std9exception143__T12errnoEnforceTiVAyaa54_423a5c444c616e675c646d64325c77696e646f77735c62696e5c2e2e5c2e2e5c7372635c70686f626f735c7374645c737464696f2e64Vmi2543Z12errnoEnforceFNfiLAyaZi (@safe int std.exception.errnoEnforce!(int, "dmd2\windows\bin\..\..\src\phobos\std\stdio.d", 2543uL).errnoEnforce(int, lazy immutable(char)[]))
CMain.obj : error LNK2019: unresolved external symbol _aApplycd1 
referenced in function 
_D3std5stdio4File17LockingTextWriter12__T3putTAyaZ3putMFNfAyaZv 
(@safe void 
std.stdio.File.LockingTextWriter.put!(immutable(char)[]).put(immutable(char)[]))
CMain.obj : error LNK2019: unresolved external symbol 
_D3std5stdio8__assertFiZv (void std.stdio.__assert(int)) 
referenced in function 
_D3std5stdio4File17LockingTextWriter10__T3putTwZ3putMFNbNiNfwZv
CMain.obj : error LNK2019: unresolved external symbol 
_D3std5stdio4File17lockingTextWriterMFNfZS3std5stdio4File17LockingTextWriter (@safe std.stdio.File.LockingTextWriter std.stdio.File.lockingTextWriter()) referenced in function _D3std5stdio16__T7writelnTAyaZ7writelnFNfAyaZv (@safe void std.stdio.writeln!(immutable(char)[]).writeln(immutable(char)[]))
CMain.obj : error LNK2001: unresolved external symbol 
_D3std5stdio12__ModuleInfoZ
CMain.obj : error LNK2019: unresolved external symbol 
_D3std5stdio13trustedStdoutFNdNeZS3std5stdio4File (@property 
@trusted std.stdio.File std.stdio.trustedStdout()) referenced in 
function _D3std5stdio16__T7writelnTAyaZ7writelnFNfAyaZv (@safe 
void 
std.stdio.writeln!(immutable(char)[]).writeln(immutable(char)[]))
CMain.obj : error LNK2019: unresolved external symbol 
_D3std3utf6toUTF8FNaNbNiNfNkJG4awZAa referenced in function 
_D3std5stdio4File17LockingTextWriter10__T3putTwZ3putMFNbNiNfwZv
CMain.obj : error LNK2019: unresolved external symbol 
_d_assert_msg referenced in function 
_D3std5stdio4File17LockingTextWriter12__T3putTAyaZ3putMFNfAyaZv 
(@safe void 
std.stdio.File.LockingTextWriter.put!(immutable(char)[]).put(immutable(char)[]))
CMain.obj : error LNK2001: unresolved external symbol 
_D10TypeInfo_k6__initZ
CMain.obj : error LNK2019: unresolved external symbol 
_D3std9exception14ErrnoException7__ClassZ referenced in function 
_D3std9exception143__T12errnoEnforceTiVAyaa54_423a5c444c616e675c646d64325c77696e646f77735c62696e5c2e2e5c2e2e5c7372635c70686f626f735c7374645c737464696f2e64Vmi2543Z12errnoEnforceFNfiLAyaZi (@safe int std.exception.errnoEnforce!(int, "dmd2\windows\bin\..\..\src\phobos\std\stdio.d", 2543uL).errnoEnforce(int, lazy immutable(char)[]))
CMain.obj : error LNK2019: unresolved external symbol 
_D3std5stdio4File6__dtorMFNfZv (@safe void 
std.stdio.File.__dtor()) referenced in function 
_D3std5stdio16__T7writelnTAyaZ7writelnFNfAyaZv (@safe void 
std.stdio.writeln!(immutable(char)[]).writeln(immutable(char)[]))
CMain.obj : error LNK2019: unresolved external symbol _d_newclass 
referenced in function 
_D3std9exception143__T12errnoEnforceTiVAyaa54_423a5c444c616e675c646d64325c77696e646f77735c62696e5c2e2e5c2e2e5c7372635c70686f626f735c7374645c737464696f2e64Vmi2543Z12errnoEnforceFNfiLAyaZi (@safe int std.exception.errnoEnforce!(int, "dmd2\windows\bin\..\..\src\phobos\std\stdio.d", 2543uL).errnoEnforce(int, lazy immutable(char)[]))
CMain.obj : error LNK2019: unresolved external symbol 
_D3std5stdio7__arrayZ referenced in function 
_D3std5stdio4File17LockingTextWriter10__T3putTwZ3putMFNbNiNfwZv
CMain.obj : error LNK2019: unresolved external symbol _d_assert 
referenced in function _D4main8__assertFiZv (void 
main.__assert(int))
CMain.obj : error LNK2019: unresolved external symbol _d_unittest 
referenced in function _D4main15__unittest_failFiZv (void 
main.__unittest_fail(int))
CMain.obj : error LNK2019: unresolved external symbol 
_D3std5stdio4File17LockingTextWriter6__dtorMFNeZv (@trusted void 
std.stdio.File.LockingTextWriter.__dtor()) referenced in function 
_D3std5stdio16__T7writelnTAyaZ7writelnFNfAyaZv (@safe void 
std.stdio.writeln!(immutable(char)[]).writeln(immutable(char)[]))
CMain.obj : error LNK2019: unresolved external symbol 
_d_arraybounds referenced in function _D4main7__arrayZ
x64\Debug DMD\CMain.exe : fatal error LNK1120: 23 unresolved 
externals

So, something funky is going on. Any ideas?




More information about the Digitalmars-d-learn mailing list