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