Node:Libraries order,
Next:Still unresolved,
Previous:Which library,
Up:Compiling
Q: I give all the libraries to gcc, but I still get unresolved
externals when I link. What gives?
A: Ld
is a one-pass linker: it only scans each library once
looking for unresolved externals it saw until that point. This
means the relative position of object files and libraries' names on the
command line is significant. You should put all the libraries
after all the object files, and in this order:
-lstdcxx -lm
E.g., to link files main.o and sub.o into a C++ library, use the following command line:
gcc -o main.exe main.o sub.o -lstdcxx -lm
or, if you compile and link in one command:
gcc -o main.exe main.cc sub.cc -lstdcxx -lm
If you have any libraries of your own, put them before the above system libraries, like this:
gcc -o main.exe main.cc sub.cc -lmylib -lstdcxx -lm
When you use the gpp
or the gxx
drivers to compile a
C++ program, it automatically names the C++ libraries in the
correct order. (gpp
and gxx
are the alternative names for
g++
on DOS, which doesn't allow the +
character in file
names.)
You can also force the linker to repeatedly scan a group of libraries
until all externals are resolved. To this end, put the names of these
libraries between the -(
and the -)
options (if you invoke
GCC to link, use the -Wl
or -Xlinker
options to pass
switches to the linker). Check out the linker docs for more info about
-( ... -)
groups.
If your installation tree is different from the default, i.e., if you keep
the libraries not in the default lib/
subdirectory, then
you should add that directory to the line in the [gcc]
section of
your DJGPP.ENV
file which starts with LIBRARY_PATH
, or put
into your environment a variable called LIBRARY_PATH
and point it
to the directory where you keep the libraries. Note that if you invoke
the linker by itself (not through the gcc driver), then
LIBRARY_PATH
will have no effect, because this variable is only
known to the gcc driver. Invoking ld
directly is not
recommended, but if you must do it, use the -L
option to tell it
where to look for the libraries.