Thread overview
Compiling+Linking problem : some black magic
Jun 19, 2005
Denis R
Jun 19, 2005
Derek Parnell
Jun 19, 2005
Denis R
Jun 19, 2005
Denis R
June 19, 2005
Hello,

I've run into linking problem, which to me is somehow related perhaps to my not understanding of how modules interract.

Below are 2 ways of compiling my project, one i would prefer (for my own makefile), which is not working (but i dont understand why), the other (i've checked it from the output of dmake tool) is working:

Method 1 (working): just all on same line :
dmd -v -c -op   dlanchat_nc.d  comms/chatcomm.d  comms/evcomm.d  util/dutil.d  dncurses/ncwindow.d  dncurses/ncincludes.d 	dncurses/ncerrors.d
Then linking step

Method 2 (not working): in steps
dmd -v -c -op util/dutil.d
dmd -v -c -op comms/evcomm.d util/dutil.o
dmd -v -c -op comms/chatcomm.d comms/evcomm.o util/dutil.o
dmd -v -c -op dncurses/ncincludes.d
dmd -v -c -op dncurses/ncerrors.d
dmd -v -c -op dncurses/ncwindow.d dncurses/ncincludes.o dncurses/ncerrors.o


Linking after either of compiling steps:
dmd -v -op dlanchat_nc.d comms/chatcomm.o comms/evcomm.o util/dutil.o dncurses/ncwindow.o dncurses/ncincludes.o dncurses/ncerrors.o -L-lncurses

which gives, if compiling with method 2, this error :

comms/chatcomm.o(.data+0x394): undefined reference to `_ModuleInfo_4util5dutil' collect2: ld returned 1 exit status
--- errorlevel 1

All module declarations and imports are in order

Does this mean that you always have to put everything on one line, with the main file ?
If not, which part of the D docs explains this compiling rules.
I really have to know, its irritating me that its not working :)

June 19, 2005
On Sun, 19 Jun 2005 13:49:39 +0200, Denis R wrote:

> Hello,
> 
> I've run into linking problem, which to me is somehow related perhaps to my not understanding of how modules interract.
> 
> Below are 2 ways of compiling my project, one i would prefer (for my own makefile), which is not working (but i dont understand why), the other (i've checked it from the output of dmake tool) is working:
> 
> Method 1 (working): just all on same line :
> dmd -v -c -op   dlanchat_nc.d  comms/chatcomm.d  comms/evcomm.d  util/dutil.d  dncurses/ncwindow.d  dncurses/ncincludes.d 	dncurses/ncerrors.d
> Then linking step
> 
> Method 2 (not working): in steps
> dmd -v -c -op util/dutil.d
> dmd -v -c -op comms/evcomm.d util/dutil.o
> dmd -v -c -op comms/chatcomm.d comms/evcomm.o util/dutil.o
> dmd -v -c -op dncurses/ncincludes.d
> dmd -v -c -op dncurses/ncerrors.d
> dmd -v -c -op dncurses/ncwindow.d dncurses/ncincludes.o dncurses/ncerrors.o
> 
> 
> Linking after either of compiling steps:
> dmd -v -op dlanchat_nc.d comms/chatcomm.o comms/evcomm.o util/dutil.o dncurses/ncwindow.o dncurses/ncincludes.o dncurses/ncerrors.o -L-lncurses
> 
> which gives, if compiling with method 2, this error :
> 
> comms/chatcomm.o(.data+0x394): undefined reference to `_ModuleInfo_4util5dutil' collect2: ld returned 1 exit status
> --- errorlevel 1
> 
> All module declarations and imports are in order
> 
> Does this mean that you always have to put everything on one line, with the main file ?
> If not, which part of the D docs explains this compiling rules.
> I really have to know, its irritating me that its not working :)

The compiler never reads a .o file, so if you are not linking you never need to have those on the command line. The compiler only compiles the .d files.

The unix linker is a bit simple-minded, in that it only reads the object and library files in the order they are presented on the command line. If "chatcomm" is referencing anything in "dutil.o" then you might need to reorder the files on the command line. I'm not sure about that but its worth a try.

Have you tried my Build utility. It's like dmake but more sophistcated and handles a lot more situations. Normally one would only need to type in ...

  build util/dutil.d

assuming you have either
   pragma(lib, "ncurses");
or
   version(build) pragma(link, "ncurses");
somewhere in your sources.

You can download it from

  www.dsource.com/projects/build

Even if you want to maintain your own makefile, you can look at the output of Build (the .rsp file) to see which files are required in the makefile.

-- 
Derek Parnell
Melbourne, Australia
BUILD v2.08 is now available. 29/May/2005
19/06/2005 10:23:16 PM
June 19, 2005
On Sun, 19 Jun 2005 22:33:11 +1000
Derek Parnell <derek@psych.ward> wrote:

Err, but my linking step is the same, that is, same order of files to the linker, as you can see, independent of my compiling steps.

So its like there is some unseen step dmd -c -op does when i give all files on same line :)

> On Sun, 19 Jun 2005 13:49:39 +0200, Denis R wrote:
> 
> > Hello,
> > 
> > I've run into linking problem, which to me is somehow related perhaps to my not understanding of how modules interract.
> > 
> > Below are 2 ways of compiling my project, one i would prefer (for my own makefile), which is not working (but i dont understand why), the other (i've checked it from the output of dmake tool) is working:
> > 
> > Method 1 (working): just all on same line :
> > dmd -v -c -op   dlanchat_nc.d  comms/chatcomm.d  comms/evcomm.d  util/dutil.d  dncurses/ncwindow.d  dncurses/ncincludes.d 	dncurses/ncerrors.d
> > Then linking step
> > 
> > Method 2 (not working): in steps
> > dmd -v -c -op util/dutil.d
> > dmd -v -c -op comms/evcomm.d util/dutil.o
> > dmd -v -c -op comms/chatcomm.d comms/evcomm.o util/dutil.o
> > dmd -v -c -op dncurses/ncincludes.d
> > dmd -v -c -op dncurses/ncerrors.d
> > dmd -v -c -op dncurses/ncwindow.d dncurses/ncincludes.o dncurses/ncerrors.o
> > 
> > 
> > Linking after either of compiling steps:
> > dmd -v -op dlanchat_nc.d comms/chatcomm.o comms/evcomm.o util/dutil.o dncurses/ncwindow.o dncurses/ncincludes.o dncurses/ncerrors.o -L-lncurses
> > 
> > which gives, if compiling with method 2, this error :
> > 
> > comms/chatcomm.o(.data+0x394): undefined reference to `_ModuleInfo_4util5dutil' collect2: ld returned 1 exit status
> > --- errorlevel 1
> > 
> > All module declarations and imports are in order
> > 
> > Does this mean that you always have to put everything on one line, with the main file ?
> > If not, which part of the D docs explains this compiling rules.
> > I really have to know, its irritating me that its not working :)
> 
> The compiler never reads a .o file, so if you are not linking you never need to have those on the command line. The compiler only compiles the .d files.
> 
> The unix linker is a bit simple-minded, in that it only reads the object and library files in the order they are presented on the command line. If "chatcomm" is referencing anything in "dutil.o" then you might need to reorder the files on the command line. I'm not sure about that but its worth a try.
> 
> Have you tried my Build utility. It's like dmake but more sophistcated and handles a lot more situations. Normally one would only need to type in ...
> 
>   build util/dutil.d
> 
> assuming you have either
>    pragma(lib, "ncurses");
> or
>    version(build) pragma(link, "ncurses");
> somewhere in your sources.
> 
> You can download it from
> 
>   www.dsource.com/projects/build
> 
> Even if you want to maintain your own makefile, you can look at the output of Build (the .rsp file) to see which files are required in the makefile.
> 
> -- 
> Derek Parnell
> Melbourne, Australia
> BUILD v2.08 is now available. 29/May/2005
> 19/06/2005 10:23:16 PM
June 19, 2005
I've seen build before, by the way. But only briefly. There is lots of options there.

I have to get it now again, and see what it does.

By the way, putting *.o files do dmd -c  is what i've seen dmake does, so i thought perhaps dmd does something with *.o files, if that module is used in the module you are compiling.

Anyway, thanks



On Sun, 19 Jun 2005 22:33:11 +1000
Derek Parnell <derek@psych.ward> wrote:

> On Sun, 19 Jun 2005 13:49:39 +0200, Denis R wrote:
> 
> > Hello,
> > 
> > I've run into linking problem, which to me is somehow related perhaps to my not understanding of how modules interract.
> > 
> > Below are 2 ways of compiling my project, one i would prefer (for my own makefile), which is not working (but i dont understand why), the other (i've checked it from the output of dmake tool) is working:
> > 
> > Method 1 (working): just all on same line :
> > dmd -v -c -op   dlanchat_nc.d  comms/chatcomm.d  comms/evcomm.d  util/dutil.d  dncurses/ncwindow.d  dncurses/ncincludes.d 	dncurses/ncerrors.d
> > Then linking step
> > 
> > Method 2 (not working): in steps
> > dmd -v -c -op util/dutil.d
> > dmd -v -c -op comms/evcomm.d util/dutil.o
> > dmd -v -c -op comms/chatcomm.d comms/evcomm.o util/dutil.o
> > dmd -v -c -op dncurses/ncincludes.d
> > dmd -v -c -op dncurses/ncerrors.d
> > dmd -v -c -op dncurses/ncwindow.d dncurses/ncincludes.o dncurses/ncerrors.o
> > 
> > 
> > Linking after either of compiling steps:
> > dmd -v -op dlanchat_nc.d comms/chatcomm.o comms/evcomm.o util/dutil.o dncurses/ncwindow.o dncurses/ncincludes.o dncurses/ncerrors.o -L-lncurses
> > 
> > which gives, if compiling with method 2, this error :
> > 
> > comms/chatcomm.o(.data+0x394): undefined reference to `_ModuleInfo_4util5dutil' collect2: ld returned 1 exit status
> > --- errorlevel 1
> > 
> > All module declarations and imports are in order
> > 
> > Does this mean that you always have to put everything on one line, with the main file ?
> > If not, which part of the D docs explains this compiling rules.
> > I really have to know, its irritating me that its not working :)
> 
> The compiler never reads a .o file, so if you are not linking you never need to have those on the command line. The compiler only compiles the .d files.
> 
> The unix linker is a bit simple-minded, in that it only reads the object and library files in the order they are presented on the command line. If "chatcomm" is referencing anything in "dutil.o" then you might need to reorder the files on the command line. I'm not sure about that but its worth a try.
> 
> Have you tried my Build utility. It's like dmake but more sophistcated and handles a lot more situations. Normally one would only need to type in ...
> 
>   build util/dutil.d
> 
> assuming you have either
>    pragma(lib, "ncurses");
> or
>    version(build) pragma(link, "ncurses");
> somewhere in your sources.
> 
> You can download it from
> 
>   www.dsource.com/projects/build
> 
> Even if you want to maintain your own makefile, you can look at the output of Build (the .rsp file) to see which files are required in the makefile.
> 
> -- 
> Derek Parnell
> Melbourne, Australia
> BUILD v2.08 is now available. 29/May/2005
> 19/06/2005 10:23:16 PM