Strange behaviour of rdmd vs. dmd concerning main function

berni via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Feb 9 07:39:18 PST 2017


I've got two source files in two directories:

Common/common.d

>module common;
>
>import std.stdio;
>
>int main(string[] args)
>{
>    Foo foo = cast(Foo)Object.factory("special.Bar");
>
>    foo.do_something();
>
>    return 0;
>}
>
>abstract class Foo {
>    abstract void do_something();
>}

Special/special.d

>module special;
>
>import std.stdio;
>import common;
>
>class Bar : Foo {
>    override void do_something()
>    {
>        writeln("works");
>    }
>}

Now I try to run it with rdmd and dmd and get quite different 
results:

>$> rdmd -ICommon Special/special.d
>works
>$> dmd -ICommon Special/special.d
>/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
>(.text+0x20): undefined reference to `main'
>special.o:(.data.rel.ro+0x18): undefined reference to 
>`_D6common12__ModuleInfoZ'
>special.o:(.data._D7special3Bar7__ClassZ+0x50): undefined 
>reference to `_D6common3Foo7__ClassZ'
>collect2: error: ld returned 1 exit status
>Error: linker exited with status 1

I encountered this, when I was curious if I can move the main 
function to a diffent module, because it will be the same in 
several modules anyway. When testing with rdmd, everything 
worked. Later, I found out, that with dmd it doesn't. (And with 
gdc and ldc2 it doesn't work too.)

For me, this looks like a bug in either rdmd or dmd. But maybe 
there is something about it that I do not understand.


More information about the Digitalmars-d-learn mailing list