Author Topic: Link Order  (Read 5179 times)

Raijinsetsu

  • Guest
Link Order
« on: January 03, 2007, 11:04:34 pm »
It seems that since I re-installed C::B(now using 3455) and cygwin(fresh install of both), all of my projects fail during the linking stage. I'm not sure whether this is a Cygwin-GCC problem, or a C::B problem. However, C::B should be able to fix what I describe below.
The problem is the order of object files given to the linker. Noramlly, files with the most dependencies go first, while files with no dependencies go last. This ensures that the linker links all external functions and data.

Output:
Code
-------------- Build: Debug in libBSException ---------------
g++.exe -Wall -DLIBBSEXCEPTION_EXPORTS -g -DDEBUG -DWIN32   -ID:/Projects/libBSException/ -c NullPointer.cpp -o .objs/Debug/NullPointer.o
g++.exe -Wall -DLIBBSEXCEPTION_EXPORTS -g -DDEBUG -DWIN32   -ID:/Projects/libBSException/ -c NullPointerNF.cpp -o .objs/Debug/NullPointerNF.o
g++.exe -Wall -DLIBBSEXCEPTION_EXPORTS -g -DDEBUG -DWIN32   -ID:/Projects/libBSException/ -c Exception.cpp -o .objs/Debug/Exception.o
g++.exe -shared   -Wl,--dll -L  .objs/Debug/NullPointer.o .objs/Debug/NullPointerNF.o .objs/Debug/Exception.o   -o bin/libBSException_d.dll 
.objs/Debug/NullPointerNF.o: In function `_ZN2BS10Exceptions13NullPointerNFD0Ev':
/cygdrive/d/Projects/libBSException/NullPointerNF.cpp:(.text+0x14): undefined reference to `BS::Exceptions::NullPointer::NullPointer(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
.objs/Debug/NullPointerNF.o: In function `_ZN2BS10Exceptions13NullPointerNFC1ERKSs':
/cygdrive/d/Projects/libBSException/NullPointerNF.cpp:4: undefined reference to `BS::Exceptions::NullPointer::NullPointer(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
.objs/Debug/NullPointerNF.o: In function `_ZN2BS10Exceptions13NullPointerNFD0Ev':
/cygdrive/d/Projects/libBSException/NullPointerNF.cpp:(.text$_ZN2BS10Exceptions11NullPointerD2Ev[BS::Exceptions::NullPointer::~NullPointer()]+0xb): undefined reference to `vtable for BS::Exceptions::NullPointer'
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 2 seconds)
1 errors, 0 warnings

This is the output of one of my smaller projects. As you can see, the linker is given a list of object files in alphabetical order, which is incorrect. The NullPointerNF.o file should be first, because it has dependencies in NullPointer.o and Exception.o. I can manually fix this, but this requires me to change the compilation priority of all my files in every project. Normally, link dependencies can be assumed in such a way: if object A's source includes object B's header, then object A can be assumed to depend on object B, and should therefore come before B on the link command.
Maybe theres a new GCC option that will alleviate this easier? Get back to me, please.

Offline mandrav

  • Project Leader
  • Administrator
  • Lives here!
  • *****
  • Posts: 4315
    • Code::Blocks IDE
Re: Link Order
« Reply #1 on: January 03, 2007, 11:16:39 pm »
You got something wrong there... The linking order matters for libraries only, not object files...
Be patient!
This bug will be fixed soon...

Raijinsetsu

  • Guest
Re: Link Order
« Reply #2 on: January 03, 2007, 11:28:51 pm »
That's the way it should be, but obviously not anymore.
When I change the compile priority of NullPointerNF to 40 and NullPointer to 45 I get this:
Code
-------------- Build: Debug in libBSException ---------------
g++.exe -pedantic -Wall -DLIBBSEXCEPTION_EXPORTS -g -DDEBUG -DWIN32   -ID:/Projects/libBSException/ -c NullPointerNF.cpp -o .objs/Debug/NullPointerNF.o
g++.exe -pedantic -Wall -DLIBBSEXCEPTION_EXPORTS -g -DDEBUG -DWIN32   -ID:/Projects/libBSException/ -c NullPointer.cpp -o .objs/Debug/NullPointer.o
g++.exe -pedantic -Wall -DLIBBSEXCEPTION_EXPORTS -g -DDEBUG -DWIN32   -ID:/Projects/libBSException/ -c Exception.cpp -o .objs/Debug/Exception.o
g++.exe -shared   -Wl,--dll -L  .objs/Debug/NullPointerNF.o .objs/Debug/NullPointer.o .objs/Debug/Exception.o   -o bin/libBSException_d.dll 
Running target post-build steps
cp -f bin\libBSException_d.dll D:\cygwin\usr\lib
Running project post-build steps
cp -f *.h D:\cygwin\usr\include/BS/
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings
Which, as you can see, works. Mind you, I am using the newest cygwin packages, so maybe the newest version of gcc released is different?
GCC -v:
Code
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/configure --ver
bose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libe
xecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-langu
ages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --
enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-
awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-thre
ads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptio
ns --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)
« Last Edit: January 03, 2007, 11:31:32 pm by Raijinsetsu »

Offline mandrav

  • Project Leader
  • Administrator
  • Lives here!
  • *****
  • Posts: 4315
    • Code::Blocks IDE
Re: Link Order
« Reply #3 on: January 04, 2007, 12:29:28 am »
Quote
Mind you, I am using the newest cygwin packages, so maybe the newest version of gcc released is different?

I wouldn't call gcc 3.4.4 "the newest" :).
Besides, I see something else wrong:

Code
g++.exe -shared   -Wl,--dll -L  .objs/Debug/NullPointerNF.o

What's that stray "-L" doing there? You understand that all it does is add the (non-existent) directory ".objs/Debug/NullPointerNF.o" to the linker search dirs? Effectively not linking the actual object file?
Be patient!
This bug will be fixed soon...

Raijinsetsu

  • Guest
Re: Link Order
« Reply #4 on: January 04, 2007, 12:46:24 am »
[edited]
Ugh... Just for the hell of it, I searched for the source of the spurious -L argument. It was an old project option that isn't used in my new install.
I see now that it was using .objs/NullPointer.o as a directory(this file has the dependencies for NullPointerNF.o).

 Thanks.
« Last Edit: January 04, 2007, 01:30:26 am by Raijinsetsu »