Subject: Re: how to avoid mulitple definitions of STL free_list, start_free, end_free,heap_size
From: [email-masked] (Mumit Khan)

9 Dec 1997 01:42:08 -0800
Message-ID: <[email-masked]>
References: <[email-masked]>
To: [email-masked]
Cc: [email-masked]

Stephen Reuss <[email-masked]> writes:
> First up, I dealt with the pair structure redeclaration issue by
> renaiming the pair structure in the third party code to mespair.  If
> anyone has ideas of how I can force compiler to choose one declaration
> or another, please let me know.

You can't. No C++ code written in the last 3, especially the last 2, years 
should've used 'struct pair', unless the author(s) was simply hoping that
STL will never make it into the standard ;-)

> 
> The new problem regards the:
>  multiple definition of `__default_alloc_template<false, 0>::start_free
>                                                            ::end_free
>                                                            ::heap_size
>                                                            ::free_list
> 
> in linking a C++ program.  The link command is as follows:
> 

Are you using the b18 C++ compiler? If so, you have other bugs to worry
about as well (miscompiled code when using multiple virtual bases and such
is just one example). If you are, then I strongly suggest you move to a
newer C++ compiler, such as egcs-1.00 or even the newer FSF snapshots.
For a binary distribution of egcs-1.00, check the URL below.

Now that my obligatory plug is out the way, the problem is that the older 
versions of C++ front-end simply couldn't handle static template data 
members properly, and hence the problem. I can suggest a few workarounds:
   
   1. Use -fno-implicit and instantiate everything yourself. I cover a bit
      about explicit instantiation in my (now grossly outdated) STL Newbie
      guide (URL below). This is the only portable (ie., something that'll
      work on *all* platforms) way to do templates with gcc, even with the 
      newest and greatest egcs release.
   2. Comment out the default_alloc_template definition in alloc.h (or
      whatever file it's in in $prefix/include/g++) and supply the
      definition yourself in one of your object files.
   3. Did I mention that you should upgrade your compiler ;-)

EGCS : http://www.xraylith.wisc.edu/~khan/software/gnu-win32/
STL  : http://www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html

Regards,
Mumit -- [email-masked]
http://www.xraylith.wisc.edu/~khan/

-
For help on using this list (especially unsubscribing), send a message to
"[email-masked]" with one line of text: "help".