diff options
Diffstat (limited to 'gcc/cp/g++FAQ.texi')
-rwxr-xr-x | gcc/cp/g++FAQ.texi | 2423 |
1 files changed, 2423 insertions, 0 deletions
diff --git a/gcc/cp/g++FAQ.texi b/gcc/cp/g++FAQ.texi new file mode 100755 index 0000000..3cbec50 --- /dev/null +++ b/gcc/cp/g++FAQ.texi @@ -0,0 +1,2423 @@ +\input texinfo.tex @c -*-texinfo-*- +@c %**start of header +@setfilename g++FAQ.info +@settitle Frequently asked questions about the GNU C++ compiler +@setchapternewpage off +@c version: %W% %G% +@c %**end of header + +@iftex +@finalout +@end iftex +@titlepage +@title G++ FAQ +@subtitle Frequently asked questions about the GNU C++ compiler +@subtitle June 8, 1998 +@sp 1 +@author Joe Buck +@page +@end titlepage + +@ifinfo +@node Top, basics, (dir), (dir) +@top +@unnumbered FAQ for g++ and libg++, by Joe Buck (jbuck@@synopsys.com) +@end ifinfo + +@cindex FAQ for g++, latest version +@cindex Archive site for FAQ lists +@cindex rtfm.mit.edu +@cindex Joe Buck <jbuck@@synopsys.com> +@cindex FAQ for C++ + +This is a list of frequently asked questions (FAQ) for g++ users; thanks to +all those who sent suggestions for improvements. Thanks to Marcus Speh +for doing the index. A hypertext version is available on the World Wide +Web at @file{http://www.cygnus.com/misc/g++FAQ_toc.html}. + +Please send updates and corrections to the FAQ to +@code{jbuck@@synopsys.com}. Please do @emph{not} use me as a resource +to get your questions answered; that's what @file{gnu.g++.help} is for and I +don't have the time to support the net's use of g++. If you ignore this +request your message to me may be deleted without a reply. Sorry. + +Many FAQs, including this one, are available on the archive site +``rtfm.mit.edu''; see @* +@file{ftp://rtfm.mit.edu/pub/usenet/news.answers}. +This FAQ may be found in the subdirectory g++-FAQ. + +@cindex Marshall Cline +@cindex comp.lang.c++ +@cindex C++ FAQ +This FAQ is intended to supplement, not replace, Marshall Cline's +excellent FAQ for the C++ language and for the newsgroup +@file{comp.lang.c++}. Especially if g++ is the first C++ +compiler you've ever used, the question ``How do I do <X> with g++?'' +is probably really ``How do I do <X> in C++?''. +You can find this FAQ at +@file{ftp://rtfm.mit.edu/pub/usenet/comp.lang.c++}, +or in HTML form at @file{http://www.cerfnet.com/~mpcline/On-Line-C++-FAQs/}. + +@menu +* basics:: What is g++? How do I get it? +* egcs and 2.8.x:: The next generation(s) of g++ +* installation:: How to install, installation problems +* evolution:: The Evolution of g++ +* User Problems:: Commonly reported problems and bugs +* legalities:: Lawyer stuff, GPL, LGPL, etc. +* index:: Index of terms + + --- The Detailed Node Listing --- + +The basics: what is g++? + +* latest versions:: What are the latest versions of g++ and libraries? +* g++ for Unix:: How do I get g++ for Unix? +* getting-egcs:: How do I get egcs? +* g++ for HP:: +* g++ for Solaris 2.x:: +* g++ for other platforms:: +* 1.x vs 2.x versions:: + +The Next Generation(s) of g++ + +* new-in-2.8.x:: What's new in gcc 2.8.x? +* egcs-intro:: What is egcs? +* egcs-whats-new:: What's new in egcs vs 2.7.2? +* egcs-bug-fixes:: What was fixed in the latest egcs releases? +* egcs-linux:: If I install on Linux, will it overwrite my libraries? +* egcs-run-both:: How can I run both egcs and an FSF release? +* egcs-vs-2.8.x:: How will egcs affect 2.8.x? +* egcs-robustness:: How robust is egcs? + +Installation Issues and Problems + +* gcc-2 + g++-1:: +* what else do I need?:: +* use GNU linker?:: +* Use GNU assembler?:: +* shared libraries:: +* repository:: +* repo bugs:: +* Use GNU C library?:: +* Global constructor problems:: +* Strange assembler errors:: +* Other problems building libg++:: +* More size_t problems:: +* Rebuild libg++?:: +* co-existing versions:: +* Installing on Linux:: +* Linux Slackware 3.0:: + +The Evolution of g++ + +* version 2.7.x:: What's changed in 2.7.x from earlier versions +* libstdc++:: + +User Problems + +* missing virtual table:: +* for scope:: +* const constructor:: +* unused parameter warnings:: +* jump crosses initialization:: +* Demangler:: +* static data members:: +* internal compiler error:: +* bug reports:: +* porting to g++:: +* name mangling:: +* problems linking with other libraries:: +* documentation:: +* templates:: +* undefined templates:: +* redundant templates:: +* Standard Template Library:: +* STL and string:: +* exceptions:: +* namespaces:: +* agreement with standards:: +* compiling standard libraries:: +* debugging on SVR4 systems:: +* debugging problems on Solaris:: +* X11 conflicts with libg++:: +* assignment to streams:: +@end menu + +@node basics, egcs and 2.8.x, Top, Top +@chapter The basics: what is g++? + +@cindex Free Software Foundation +@cindex GNU Public License +@cindex GPL + +g++ is the traditional nickname of GNU C++, a freely redistributable +C++ compiler produced by the Free Software Foundation plus dozens of +skilled volunteers. I say ``traditional nickname'' because the GNU +compiler suite, gcc, bundles together compilers for C, Objective-C, +and C++ in one package. + +While the source code to gcc/g++ can be downloaded for free, +it is not public domain, but is protected by the GNU Public License, +or GPL (@pxref{legalities}). + +@menu +* latest versions:: What is the latest version of gcc/g++/libg++? +* g++ for Unix:: How do I get a copy of g++ for Unix? +* getting-egcs:: How do I get egcs? +* g++ for HP:: Getting g++ for the HP precision architecture +* g++ for Solaris 2.x:: Getting g++ for Solaris +* g++ for other platforms:: +* 1.x vs 2.x versions:: +@end menu + +@node latest versions, g++ for Unix, basics, basics +@section What is the latest version of gcc, g++, and libg++? + +@cindex egcs release + +The newest release from the egcs project (on the Web: +@file{http://www.cygnus.com/egcs/}) is egcs-1.0.3, released May 15, +1998. + +@cindex gcc/g++, version date +The current version of gcc/g++ is 2.8.1, released March 4, 1998. +This release fixes some bugs in the 2.8.x release from January. +It is a huge improvement over the 2.7.x releases. + +libg++ has now been deprecated (that is, it is no longer really +supported), so gcc2.8.1 users need to grab libstdc++-2.8.1 from +their favorite GNU site (egcs users don't need to get this separately +as it is bundled with egcs). However, there is an 'add-on' libg++ 2.8.1 +mini-release. If you want to use it, you need to combine it with +libstdc++ 2.8.1. + +I would strongly recommend that anyone using a g++ version earlier +than 2.7.2 should upgrade if at all possible (@pxref{version 2.7.x}). +Folks who need modern C++ features should upgrade to 2.8.1 or egcs. + +For some non-Unix platforms, the latest port of gcc may be an earlier +version (2.7.2, say). You'll need to use a version of libg++ that +has the same first two digits as the compiler version, e.g. use libg++ +2.7.x (for the latest x you can find) with gcc version 2.7.2.1. + +From version 2.8.0 on, you don't need libg++, you only need libstdc++ +(again, the latest version with the same two leading digits as the +version of g++ you use). + +The latest "1.x" version of gcc is 1.42, and the latest "1.x" version of +g++ is 1.42.0. +While gcc 1.42 is quite usable for C programs, g++ 1.x is only of +historical interest (since the C++ language has changed so much). + +@node g++ for Unix, getting-egcs, latest versions, basics +@section How do I get a copy of g++ for Unix? + +First, you may already have it if you have gcc for your platform; +g++ and gcc are combined now (as of gcc version 2.0). +@cindex GNU gcc, version +@cindex GNU g++ and gcc + +You can get g++ from a friend who has a copy, by anonymous FTP or +UUCP, or by ordering a tape or CD-ROM from the Free Software +Foundation. +@cindex g++, ordering +@cindex g++, getting a copy + +The Free Software Foundation is a nonprofit organization that +distributes software and manuals to raise funds for more GNU +development. Getting your copy from the FSF contributes directly to +paying staff to develop GNU software. CD-ROMs cost $400 if an +organization is buying, or $100 if an individual is buying. Tapes +cost around $200 depending on media type. I recommend asking for +version 2, not version 1, of g++. +@cindex FSF [Free Software Foundation] +@cindex GNU [GNU's not unix] + +For more information about ordering from the FSF, contact +gnu@@prep.ai.mit.edu, phone (617) 542-5942 or anonymous ftp file +@file{ftp://prep.ai.mit.edu/pub/gnu/GNUinfo/ORDERS} (you can +also use one of the sites listed below if you can't get into ``prep''). + +@cindex FSF, contact <gnu@@prep.ai.mit.edu> + +Here is a list of anonymous FTP archive sites for GNU software. +If no directory is given, look in @file{/pub/gnu}. + +@cindex GNUware, anonymous FTP sites + +@example +ASIA: ftp.cs.titech.ac.jp, tron.um.u-tokyo.ac.jp:/pub/GNU/prep +cair-archive.kaist.ac.kr, ftp.nectec.or.th:/pub/mirrors/gnu + +AUSTRALIA: archie.au:/gnu (archie.oz or archie.oz.au for ACSnet) + +AFRICA: ftp.sun.ac.za + +MIDDLE-EAST: ftp.technion.ac.il:/pub/unsupported/gnu + +EUROPE: irisa.irisa.fr, ftp.univ-lyon1.fr, +ftp.mcc.ac.uk, unix.hensa.ac.uk:/mirrors/uunet/systems/gnu, +src.doc.ic.ac.uk:/gnu, ftp.ieunet.ie, ftp.eunet.ch, +nic.switch.ch:/mirror/gnu, ftp.informatik.rwth-aachen.de, +ftp.informatik.tu-muenchen.de, ftp.win.tue.nl, ftp.nl.net, +ftp.etsimo.uniovi.es, ftp.funet.fi, ftp.denet.dk, +ftp.stacken.kth.se, isy.liu.se, ftp.luth.se:/pub/unix/gnu, +ftp.sunet.se, archive.eu.net + +SOUTH AMERICA: ftp.inf.utfsm.cl, ftp.unicamp.br + +WESTERN CANADA: ftp.cs.ubc.ca:/mirror2/gnu + +USA: wuarchive.wustl.edu:/systems/gnu, labrea.stanford.edu, +ftp.digex.net, ftp.kpc.com:/pub/mirror/gnu, f.ms.uky.edu:/pub3/gnu, +jaguar.utah.edu:/gnustuff, ftp.hawaii.edu:/mirrors/gnu, +uiarchive.cso.uiuc.edu, ftp.cs.columbia.edu:/archives/gnu/prep, +gatekeeper.dec.com:/pub/GNU, ftp.uu.net:/systems/gnu +@end example + +The ``official site'' is prep.ai.mit.edu, but your transfer will probably +go faster if you use one of the above machines. + +@cindex gzip +Most GNU utilities are compressed with ``gzip'', the GNU compression +utility. All GNU archive sites should have a copy of this program, +which you will need to uncompress the distributions. + +@cindex libstdc++ +Don't forget to retrieve libstdc++ as well! + +@node getting-egcs, g++ for HP, g++ for Unix, basics +@section How do I get egcs? + +See @xref{egcs-intro} to find out what egcs is. + +You can obtain egcs either by FTP or with a Web browser. To do the +latter, start from @file{http://egcs.cygnus.com/}. The master +FTP site is @file{ftp://ftp.cygnus.com/pub/egcs/releases}, however +you'll probably get a faster download if you use a mirror site. +Mirror sites also have egcs snapshots unless otherwise noted. +@itemize @bullet +@item +US (west coast): @file{ftp://go.cygnus.com/pub/ftp.cygnus.com/egcs/} +@item +US (east coast): @file{ftp://ftp.goof.com/pub/pcg/egcs/} +or (for releases only): @file{ftp://cambridge.cygnus.com/pub/egcs/} +@item +US (Arizona): @file{ftp://ftp.ninemoons.com/pub/mirrors/egcs/} +@item +UK: @file{ftp://sunsite.doc.ic.ac.uk/Mirrors/egcs.cygnus.com/pub/egcs/} +@item +Austria: @file{ftp://gd.tuwien.ac.at/gnu/egcs} +@item +France: @file{ftp://ftp.ilog.fr/pub/mirrors/egcs/} or +@file{ftp://ftp.lip6.fr/pub/egcs} +@item +Czech Republic: @file{ftp://sunsite.mff.cuni.cz/pub/GNU/egcs/} +@item +Denmark: @file{ftp://sunsite.auc.dk/pub/egcs/} +@item +Germany @file{ftp://ftp.fu-berlin.de/unix/languages/egcs/} or +@file{ftp://ftp.gwdg.de/pub/cygnus/egcs/} +@item +Poland: @file{ftp://sunsite.icm.edu.pl/pub/programming/egcs/} +@item +Sweden: @file{ftp://ftp.sunet.se/pub/gnu/egcs/} +@item +Brasil (releases only, no snapshots): +@file{ftp://ftp.unicamp.br/pub/gnu/=EXTRA=/cygnus/egcs/} +@item +Portugal: @file{ftp://ftp.lca.uevora.pt/pub/egcs/} +@item +Romania: @file{ftp://ftp.lbi.ro/pub/egcs/} +@item +Australia/NZ (release only): @file{ftp://moshpit.cygnus.com/pub/egcs/} +@end itemize + +@node g++ for HP, g++ for Solaris 2.x, getting-egcs, basics +@section Getting gcc/g++ for the HP Precision Architecture + +@cindex HP Precision Architecture +@cindex Hewlett-Packard +@cindex GNU GAS +@cindex GNU gdb + +If you use the HP Precision Architecture (HP-9000/7xx and HP-9000/8xx) +and you want to use debugging, you'll need to use the GNU assembler, GAS +(version 2.3 or later). If you build from source, you must tell the +configure program that you are using GAS or you won't get debugging +support. A non-standard debug format is used, since until recently HP +considered their debug format a trade secret. Thanks to the work of +lots of good folks both inside and outside HP, the company has seen the +error of its ways and has now released the required information. The +team at the University of Utah that did the gcc port now has code that +understands the native HP format. + +There are binaries for GNU tools in +@file{ftp://jaguar.cs.utah.edu/dist/}, +but these are older versions. + +Jeff Law has left the University of Utah, so the Utah prebuilt +binaries may be discontinued. + +@node g++ for Solaris 2.x, g++ for other platforms, g++ for HP, basics +@section Getting gcc/g++ binaries for Solaris 2.x + +``Sun took the C compiler out of Solaris 2.x. Am I stuck?'' + +@cindex Solaris +@cindex gcc/g++ binaries for Solaris + +You can obtain and install prebuilt binaries of gcc. + + +@cindex Solaris pkgadd utility +The WWW site @file{http://smc.vnet.net/} +contains various +GNU and freeware programs for Solaris 2.5 or 2.6, for either the Sparc +or Intel platforms. These are +packaged to enable easy installation using the Solaris ``pkgadd'' utility. +These include GNU emacs, gcc, gdb, perl, and others. + +You can find also find prebuilt binaries of many GNU tools, including the +compiler, at @file{http://sunsite.unc.edu/pub/solaris/}. + +@node g++ for other platforms, 1.x vs 2.x versions, g++ for Solaris 2.x, basics +@section How do I get a copy of g++ for (some other platform)? + +@cindex Windows NT support +As of gcc-2.7.x, there is Windows NT support in gcc. Some special +utilities are required. See the INSTALL file from the distribution. +If you're interested in GNU tools on Windows NT, see +@file{http://www.cygnus.com/misc/gnu-win32/} on the WWW, or the +anonymous FTP directory +@file{ftp://ftp.cygnus.com/pub/gnu-win32/}. + +@cindex VMS support +@cindex VAX +@cindex VMS, g++/libg++ precompiled + +The standard gcc/g++ distribution includes VMS support for the Vax. +Since the FSF people don't use VMS, it's likely to be somewhat less +solid than the Unix version. Precompiled copies of g++ and libg++ in +VMS-installable form for the Vax are available by FTP from +@file{ftp://mango.rsmas.miami.edu/pub/VMS-gcc/}. + +@cindex OpenVMS/Alpha +Klaus Kaempf (kkaempf@@progis.de) +has done a port to OpenVMS for the Alpha; this is not yet a +part of the official gcc/g++. +The port includes g++ and all libraries from the libg++ distribution. See +@file{http://www.progis.de} for more details. + +@cindex MS-DOS support +@cindex Delorie's gcc/g++ +@cindex DJGPP +@cindex EMX +There are two different versions of gcc/g++ for MS-DOS: EMX and DJGPP. +EMX also works for OS/2 and is described later. +DJGPP is DJ Delorie's port. It can be found on many FTP archive +sites; try +@file{ftp://ftp.coast.net/SimTel/vendors/djgpp/} +or, for a complete list, see +@file{http://www.delorie.com/djgpp/getting.html}. + + +The latest version of DJGPP is 2.00. See +@file{http://www.delorie.com/djgpp/v2/} for information on this version. + +FSF sells floppies with DJGPP on them; see above for ordering software +from the FSF. + +DJGPP has its own newsgroup: @file{comp.os.msdos.djgpp}. + +@cindex Amiga support +Development and porting efforts for GNU tools, including gcc/g++, for +the Amiga are maintained by an initiative named ADE (Amiga Developers +Environment. More information about ADE is available at +@file{http://www.ninemoons.com/}. + +For more information on Amiga ports of gcc/g++, retrieve the file +@file{ftp://prep.ai.mit.edu/pub/gnu/MicrosPorts/Amiga}. + +@cindex Atari ST support +A port of gcc to the Atari ST can be found at @* +@file{ftp://atari.archive.umich.edu/atari/Gnustuff/Tos} +along with many +other GNU programs. This version is usually the same as the latest FSF +release. See the ``Software FAQ'' for the Usenet group +@file{comp.sys.atari.st} for more information. + +@cindex EMX port +@cindex OS/2 support + +EMX is a port of gcc to OS/2; it can also be used on MS-DOS. In addition to +the compiler port, the EMX port's C library attempts to provide a +Unix-like environment. For more information ask around on +@file{comp.os.os2.programmer.porting}. Version 0.9c, based on gcc-2.7.2.1, +was released in +November 1996. It is available by FTP and the WWW from, among other +places + +@example +@file{http://www.os2ss.com/unix/emx09c/} +@file{ftp://ftp.cdrom.com/pub/os2/emx09c/} (US) +@file{ftp://ftp.leo.org/pub/comp/os/os2/leo/devtools/emx+gcc/} (Germany) +@end example + +Eberhard Mattes did the EMX port. His address is +mattes@@azu.informatik.uni-stuttgart.de. +Read the FAQ file included with the distribution before harrassing the author. + +@cindex Apple support +@cindex Macintosh support + +I'm looking for more information on gcc/g++ support on the Apple +Macintosh. Until recently, this FAQ did not provide such information, +but FSF is no longer boycotting Apple as the League for Programming +Freedom boycott has been dropped. + +Versions 1.37.1 and 2.3.3 of gcc were ported by Stan Shebs and are available +at @* +@file{ftp://ftp.cygnus.com/pub/mac} + +They are both interfaced to MPW. +Stan is working on a version using the current (post-2.7) sources, contact +him directly (shebs@@cygnus.com) for more information. + +@node 1.x vs 2.x versions, , g++ for other platforms, basics +@section But I can only find g++-1.42! + +``I keep hearing people talking about g++ 2.8.1 (or some other number +starting with 2), but the latest version I can find is g++ 1.42. Where +is it?'' + +@cindex Objective-C +@cindex g++, version number +As of gcc 2.0, C, C++, and Objective-C as well are all combined into a +single distribution called gcc. If you get gcc you already have g++. The +standard installation procedure for any gcc version 2 compiler will +install the C++ compiler as well. + +One could argue that we shouldn't even refer to "g++-2.x.y" but it's a +convention. It means ``the C++ compiler included with gcc-2.x.y.'' + +@node egcs and 2.8.x, installation, basics, Top +@chapter The Next Generation(s) of g++ + +@menu +* new-in-2.8.x:: What's new in gcc 2.8.x? +* egcs-intro:: What is egcs? +* egcs-whats-new:: What's new in egcs vs 2.7.2? +* egcs-bug-fixes:: What was fixed in the latest egcs releases? +* egcs-linux:: If I install on Linux, will it overwrite my libraries? +* egcs-run-both:: How can I run both egcs and an FSF release? +* egcs-vs-2.8.x:: How will egcs affect 2.8.x? +* egcs-robustness:: How robust is egcs? +@end menu + +@node new-in-2.8.x, egcs-intro, egcs and 2.8.x, egcs and 2.8.x +@section What's new in gcc/g++ 2.8.x? + +After a two-year wait, gcc 2.8.0 was released in January 1998, along +with libstdc++-2.8.0 and libg++-2.8.0. This has been followed up in +March by the 2.8.1 release of all three packages, though libg++-2.8.1 +is an "add-on" (it does not contain libstdc++ anymore). Note that +libstdc++ is required. + +For those familiar with egcs, the most obvious difference between +gcc-2.8.x and egcs is the packaging: egcs is bundled with +libstdc++, and gcc-2.8.x does not contain the class library. Otherwise, +except for the lack of the @code{-frepo} option and some bug fixes +that have not yet made it into gcc-2.8.x, C++ users will find the +two compilers to be almost the same at this stage, other than that 2.8.x +users may get more bogus warnings with -Wall and optimization because +some fixes to flow analysis in the presence of exceptions that egcs made +are not yet present in gcc 2.8.x (as of 2.8.1). + +The flow analysis problem in 2.8.1 produces bad code in some cases, not +just spurious errors. It only affects code that actually throws an +exception, and only the path corresponding to a thrown exception gets +misoptimized. If this happens, you can try reducing the level of +optimization. + +Because the new feature lists for egcs and gcc 2.8 are almost the same, +please see @xref{egcs-whats-new} for a list of new features. It is a +fairly long list. + +@node egcs-intro, egcs-whats-new, new-in-2.8.x, egcs and 2.8.x +@section What is egcs? + +egcs is the experimental GNU compiler system (see +@file{http://www.cygnus.com/egcs} on the Web). It is an effort to +accelerate development of new gcc features by providing a more open +development model than gcc has traditionally used. + +The first egcs release, egcs-1.0, came out on December 3, 1997. +The current release is egcs-1.0.3, released May 15, 1998. + +Questions not addressed here may be answered in the egcs FAQ +(@file{http://www.cygnus.com/egcs/faq.html}). + +@node egcs-whats-new, egcs-bug-fixes, egcs-intro, egcs and 2.8.x +@section What new C++ features are in egcs? + +@strong{Note}: unless indicated otherwise, these features are also +present in g++ 2.8.x. + +@itemize @bullet +@item +@cindex integrated libstdc++ + +The standard C++ classes are integrated with the egcs release (but +@strong{not} for gcc-2.8.x, which does not include the class libraries). +libg++ is not being +supported, though an add-on version that will work with egcs can be found at +@file{ftp://ftp.yggdrasil.com/private/hjl/libg++-2.8.0b6.6.tar.gz}, +thanks to H.J. Lu. The compiler and library are configured and built +in one step. + +@item +@cindex new template implementation +A completely new template implementation, much closer to the draft +standard. Limitations in 2.7.2.x concerning inlining template functions +are eliminated. Static template data members, template class member +functions, partial specification, and default template arguments are +supported. An instantiation method resembling that used in Borland C++ +(instantiating functions possibly in multiple .o files and using weak +symbols to link correctly) is provided, in addition to other +options. The SGI version of STL is shipped verbatim with libstdc++ +(libstdc++ is included with egcs, separate with gcc-2.8.x). + +@item +@cindex redundant template elimination +@cindex templates: removing redundancy +On ELF platforms (Linux/ELF, Solaris, SVR4), if the GNU linker is used, +duplicated template functions and virtual function tables are eliminated +at link time. + +@item +@cindex repository +@cindex -frepo +The @code{-frepo} flag is supported in egcs (it is not in 2.8.x). +However, because of the previous item, I don't recommend its use on ELF +systems, as the default method is better. + +@item +@cindex new exception implementation +Exception handling has been re-worked; exceptions will work together +with optimization. +Actually, there are two separate implementations: one based on setjmp/longjmp +and designed to be highly portable, and one designed to be more efficient but +requiring more processor-specific support (getting exceptions right has proven +to be extremely difficult and has been the chief obstacle to getting a new +release out). + +@item +@cindex RTTI +RTTI has been re-done to work correctly and is on by default. + +@item +@cindex overloading +Overloading has been re-worked to conform to the latest draft of the +standard. + +@item +There are many more changes: see @file{http://www.cygnus.com/egcs/c++features.html} for a list. +@end itemize + +Features that are still missing include namespaces and templates as +template arguments, though there is support for the latter feature +in the egcs snapshots (which has not yet made it into a release). + +@node egcs-bug-fixes, egcs-linux, egcs-whats-new, egcs and 2.8.x +@section What was fixed in the latest egcs releases? + +@itemize @bullet + +@item +Add support for Red Hat 5.0 Linux and better support for Linux +systems using glibc2. (1.0.3 was specifically done to fix some +remaining problems detected when building Red Hat 5.1). + +@item +Compatibility with both egcs-1.0 and gcc-2.8 libgcc exception handling +interfaces (see below). + +@item +Various bugfixes in the x86, hppa, mips, and rs6000/ppc backends. + +@item +A few machine independent bugfixes, mostly to fix code generation bugs +when building Linux kernels or glibc. + +@item +Fix a few critical exception handling and template bugs in the C++ +compiler. + +@item +Fix build problems on x86-solaris systems. +@end itemize + +To avoid future compatibility problems, we strongly urge anyone who is +planning on distributing shared libraries that contain C++ code to +upgrade to at least egcs-1.0.1 first (and preferably to 1.0.3). See +@file{http://www.cygnus.com/egcs/egcs-1.0.1.html} for details about the +compatibility issues as well as additional information about the +bugfixes since the egcs-1.0 release. + +@node egcs-linux, egcs-run-both, egcs-bug-fixes, egcs and 2.8.x +@section If I install egcs on Linux, will it overwrite my libraries? + +No. If you build from sources, by default, egcs installs executables in +@code{/usr/local/bin} and libraries in @code{/usr/local/lib}, and you +can change this default if desired (see next section). + +If, however, you install a package (e.g. Debian or Red Hat) that wants +to put egcs in @code{/usr/bin} and @code{/usr/lib}, then yes, you are +replacing your system compiler and C++ library (I don't know if anyone +has provided such packages yet -- proceed with caution). + +@node egcs-run-both, egcs-vs-2.8.x, egcs-linux, egcs and 2.8.x +@section How can I run both egcs and an FSF release of g++ on the same machine? + +The recommended approach is to provide a different argument to the +@code{--prefix} flag when you configure egcs. For example, say +@code{--prefix=/usr/local/egcs} and then, after installation, you +can make symbolic links from @file{/usr/local/egcs/bin} to whereever +you want, for example + +@example +ln -s /usr/local/egcs/bin/gcc /usr/local/bin/egcc +ln -s /usr/local/egcs/bin/g++ /usr/local/bin/eg++ +@end example + +@node egcs-vs-2.8.x, egcs-robustness, egcs-run-both, egcs and 2.8.x +@section What about 2.8.x? How does egcs affect the 2.8.x development? + +2.8.0 has now been released (followed up by 2.8.1), with essentially the +same C++ front end as egcs. + +Bug fixes generated in egcs will be passed to the 2.8.x releases for +inclusion; the reverse is also taking place, though a bug fix may +appear in one before it does in the other. egcs development is currently +proceeding much more quickly than gcc 2.8.x development. However, there +is essentially only one C++ front end, which is shared by the two +distinct compiler back ends (however, since egcs-1.0.3 is newer than +gcc 2.8.1, it has more bug fixes). + +@node egcs-robustness, , egcs-vs-2.8.x, egcs and 2.8.x +@section How robust is egcs? + +While the 'e' stands for 'experimental', egcs has been tested thoroughly +and should be of high quality. The author considers egcs 1.0.3 the +most robust GNU C++ compiler ever produced. + +@node installation, evolution, egcs and 2.8.x, Top +@chapter Installation Issues and Problems + +@menu +* gcc-2 + g++-1:: +* what else do I need?:: +* use GNU linker?:: +* Use GNU assembler?:: +* shared libraries:: +* repository:: +* repo bugs:: +* Use GNU C library?:: +* Global constructor problems:: +* Strange assembler errors:: +* Other problems building libg++:: +* More size_t problems:: +* Rebuild libg++?:: +* co-existing versions:: +* Installing on Linux:: +* Linux Slackware 3.0:: +@end menu + +@node gcc-2 + g++-1, what else do I need?, installation, installation +@section I can't build g++ 1.x.y with gcc-2.x.y! + +``I obtained gcc-2.x.y and g++ 1.x.y and I'm trying to build it, but +I'm having major problems. What's going on?'' + +@cindex g++, building +If you wish to build g++-1.42, you must obtain gcc-1.42 first. The +installation instructions for g++ version 1 leave a lot to be desired, +unfortunately, and I would recommend that, unless you have a special +reason for needing the 1.x compiler, that C++ users use the latest +g++-2.x version, as it +is the version that is being actively maintained. + +@cindex g++, template support +@cindex Templates +@cindex ANSI draft standard +There is no template support in g++-1.x, and it is generally much further +away from the ANSI draft standard than g++-2.x is. + +@node what else do I need?, use GNU linker?, gcc-2 + g++-1, installation +@section OK, I've obtained gcc; what else do I need? + +@cindex libg++ +First off, you'll want libg++ as you can do almost nothing without it +(unless you replace it with some other class library). + +@cindex GNU GAS +@cindex GNU GAS [assembler] +Second, depending on your platform, you may need "GAS", the GNU assembler, +or the GNU linker (see next question). + +@cindex GNU gdb +Finally, while it is not required, you'll almost certainly want the GNU +debugger, gdb. The latest version is +4.17, released April 27, 1997. +Other debuggers (like dbx, for example) will normally not be able to +understand at least some of the debug information produced by g++. + +@node use GNU linker?, Use GNU assembler?, what else do I need?, installation +@section Should I use the GNU linker, or should I use "collect"? + +@cindex Linker +@cindex System VR3, linker +@cindex System VR4, linker +First off, for novices: special measures must be taken with C++ to arrange +for the calling of constructors for global or static objects before the +execution of your program, and for the calling of destructors at the end. +(Exception: System VR3 and System VR4 linkers, Linux/ELF, and some other +systems support user-defined +segments; g++ on these systems requires neither the GNU linker nor +collect. So if you have such a system, the answer is that you don't +need either one, though using GNU ld does have some advantages over +the native linker in some cases). + +@cindex AT&T cfront +@cindex Cfront-end +@cindex collect program +@cindex GNU linker +@cindex GNU binutils +If you have experience with AT&T's "cfront", this function is performed +there by programs named "patch" or "munch". With GNU C++, it is performed +either by the GNU linker or by a program known as "collect". The collect +program is part of the gcc-2.x distribution; you can obtain the GNU linker +separately as part of the "binutils" package. The latest version of +binutils is 2.9.1, released May 1, 1998. + +Note that if you want to use exceptions on Intel-like platforms and use +gas (e.g. you run Linux), you need binutils version 2.8.1 or newer for +exceptions to work correctly! + +(To be technical, it's "collect2"; there were originally several +alternative versions of collect, and this is the one that survived). + +There are advantages and disadvantages to either choice. + +Advantages of the GNU linker: +@cindex GNU linker, advantages +@cindex GNU ld +@cindex ld [GNU linker] + +It's faster than using collect -- collect basically runs the standard Unix +linker on your program twice, inserting some extra code after the first +pass to call the constructors. This is a sizable time penalty for large +programs. The GNU linker does not require this extra pass. + +GNU ld reports undefined symbols using their true names, not the mangled +names (but as of 2.7.0 so does collect). + +If there are undefined symbols, GNU ld reports which object file(s) refer to +the undefined symbol(s). On some OSes (e.g. SunOS, Solaris) the native +linker does not do this, so you have to track down who's referring to +the missing symbols yourself. + +As of binutils version 2.2, on systems that use the so-called "a.out" +debug format (e.g. Suns running SunOS 4.x), the GNU linker compresses +the debug symbol table considerably. The 2.7 version adds some symbol +table compression for ELF and Solaris targets. + +Users of egcs or 2.8.x on ELF systems should definitely +use GNU ld (2.8 or later), as it will automatically remove duplicate +instantiations of templates, virtual function tables, or ``outlined'' +copies of inline functions. + +@cindex collect linker, advantages +Advantages of collect: + +@cindex Shared libraries +If your native linker supports shared libraries, you can use shared +libraries with collect. This used to be a strong reason @emph{not} +to use the GNU linker, but recent versions of GNU ld support linking +with shared libraries on many platforms, and creating shared libraries +on a few (such as Intel x86 systems that use ELF object format as well +as SunOS and Solaris). + +@xref{shared libraries} + +@cindex GNU linker, porting +The GNU linker has not been ported to as many platforms as g++ has, so you +may be forced to use collect. + +If you use collect, you don't need to get something extra and figure out +how to install it; the standard gcc installation procedure will do it for you. + +I used to say at this point that I don't see a clear win for either +linking alternative, but with all the improvements in the GNU linker +I think that it is now the better choice. Take your pick. + +If you run Linux, the only available linker is the GNU linker. + +@node Use GNU assembler?, shared libraries, use GNU linker?, installation +@section Should I use the GNU assembler, or my vendor's assembler? + +@cindex Assembler +@cindex GNU GAS +This depends on your platform and your decision about the GNU linker. For +most platforms, you'll need to use GAS if you use the GNU linker. For +some platforms, you have no choice; check the gcc installation notes to +see whether you must use GAS. But you can usually use the vendor's +assembler if you don't use the GNU linker. + +The GNU assembler assembles faster than many native assemblers; however, +on many platforms it cannot support the local debugging format. + +It used to be that the GNU assembler couldn't handle +position-independent code on SunOS. This is no longer true if you +have version 2.6 or newer. + +On HPUX or IRIX, you must use GAS (and configure gcc with the +@code{--with-gnu-as} option) to debug your programs. GAS is +strongly recommended particularly on the HP platform because of +limitations in the HP assembler. + +The GNU assembler has been merged with the binutils +distribution, so the GNU assembler and linker are now together in +this package (as of binutils version 2.5.1). + +On Linux the assembler is the GNU assembler. + +@node shared libraries, repository, Use GNU assembler?, installation +@section How do I build shared libraries with g++? + +For gcc-2.7.0 and later, building C++ shared libraries should work fine +on supported platforms (HPUX 9+, IRIX 5+, DEC UNIX (formerly OSF/1), +SGI/IRIX, AIX, SunOS 4, Linux/ELF and all targets using SVR4-style ELF shared +libraries). There are two separate issues: building libg++ as a shared +library, and making your own shared libraries. For libg++ it is simply +a matter of giving the @code{--enable-shared} option to the configure +program. When compiling your own code for shared libraries you +generally +must use the @code{-fPIC} flag to get position-independent code. + +@cindex -shared flag of gcc + +If your shared library contains global or static objects with +constructors, then make sure to use @code{gcc -shared}, not +@code{ld}, to create the shared library. This will make sure +that any processor-specific magic needed to execute the constructors +is included. + +In theory, constructors for objects in your shared library should be +called when the library is opened (by dlopen or equivalent). This +does not work on some platforms (e.g. SunOS4; it does work on Solaris +and ELF systems such as Linux): on the broken platforms, the +constructors are not called correctly. + +David Nilsen has suggested the following workaround: + +The thing to realize is that if you link your dynamic module with the +@code{-shared} flag, the collect program nicely groups all the static +ctors/dtors for you into a list and sets up a function that will call +them (Note: this means that this trick won't work if you use the GNU +linker without collect (@pxref{use GNU linker?}). + +The magic is knowing these function names. Currently, they're called: + +@example +_GLOBAL__DI <-- calls all module constructors +_GLOBAL__DD <-- calls all module destructors +@end example + +[ possibly the leading underscore will differ between platforms: jbuck ] + +Therefore, if you make a wrapper around dlopen that looks up the +symbol @code{_GLOBAL__DI} (or @code{__GLOBAL__DI} on SunOS4 machines), and +calls it, you'll simulate getting the constructors called. + +You also need to set up the destructors to be called as well, so you +need to put a wrapper around dlclose, which will call the +@code{_GLOBAL__DD} function in the module when/if it's unloaded. + +Lastly, to get things 100% correct, you need to set up the destructors +to also be called if the module is not unloaded, but the main program +exits. I do this by registering a single function with @code{atexit()} that +calls all the destructors left in dynamically loaded modules. + +@cindex Shared version of libg++ +Check the file @file{README.SHLIB} from the libg++ distribution for more +about making and using shared libraries. + +@cindex Shared libraries with HP + +A patch is needed to build shared versions of version 2.7.2 of libg++ +and libstdc++ on the HP-PA architecture. You can find the patch at +@file{ftp://ftp.cygnus.com/pub/g++/libg++-2.7.2-hppa-gcc-fix}. + +@node repository, repo bugs, shared libraries, installation +@section How do I use the new repository code? + +@cindex repo patch +Because there is some disagreement about the details of the template +repository mechanism, you'll need to obtain a patch from Cygnus Support +to enable the 2.7.2 repository code. You can obtain the patch by +anonymous FTP: @file{ftp://ftp.cygnus.com/pub/g++/gcc-2.7.2-repo.gz}. + +There are patches for 2.7.0 and 2.7.1 in the same directory, though +if you're going to rebuild the compiler you should use the latest one. + +@cindex repo patch for BSD +If you're running NetBSD or BSDI, the Cygnus repo patch is not quite +correct. Tim Liddelow has made an alternate version available at +@file{ftp://ftp.cst.com.au/pub/gcc-2.7.2-repo-bsd.gz}. + +After you've applied the patch, the @code{-frepo} flag will enable the +repository mechanism. The flag works much like the existing +@code{-fno-implicit-templates} flag, except that auxiliary files, with +an @file{.rpo} extension, are built that specify what template +expansions are needed. At link time, the (patched) collect program +detects missing templates and recompiles some of the object files +so that the required templates are expanded. + +Note that the mechanism differs from that of cfront in that template +definitions still must be visible at the point where they are to be +expanded. No assumption is made that @file{foo.C} contains template +definitions corresponding to template declarations in @file{foo.h}. + +@cindex closure with repo +@cindex template closure +Jason Merrill writes: ``To perform closure on a set of objects, just try +to link them together. It will fail, but as a side effect all needed +instances will be generated in the objects.'' + +@node repo bugs, Use GNU C library?, repository, installation +@section Known bugs and problems with the repo patch + +``The @code{-frepo} won't expand templated friend functions!'' + +This is a known bug; currently you'll have to explicitly instantiate +friend functions when using @code{-frepo} due to this bug (in 2.7.0 +through 2.7.2 at least). + +With earlier versions of the repo patch, there was a bug that happens +when you have given a quoted command line switch, something like + +@example +-D'MESSAGE="hello there"' +@end example + +The repo code tries to recompile files using the same flags you +originally specified, but doesn't quote arguments that need quoting, +resulting in failures in some cases. This is no longer a problem +with the 2.7.2 patch. + +@node Use GNU C library?, Global constructor problems, repo bugs, installation +@section Should I use the GNU C library? + +@cindex GNU C library +@cindex libg++ +At this point in time, no (unless you are running Linux or the GNU Hurd +system). The GNU C library is still very young, and +libg++ still conflicts with it in some places. Use your native C library +unless you know a lot about the gory details of libg++ and gnu-libc. This +will probably change in the future. + +@node Global constructor problems, Strange assembler errors, Use GNU C library?, installation +@section Global constructors aren't being called + +@cindex global constructors +``I've installed gcc and it almost works, but constructors and +destructors for global objects and objects at file scope aren't being +called. What did I do wrong?'' + +@cindex collect program +It appears that you are running on a platform that requires you to +install either "collect2" or the GNU linker, and you have done neither. +For more information, see the section discussing the GNU linker +(@pxref{use GNU linker?}). + +@cindex constructor problems on Solaris +@cindex Solaris, constructor problems +On Solaris 2.x, you shouldn't need a collect program and GNU ld doesn't run. +If your global constructors aren't being called, you may need to install +a patch, available from Sun, to fix your linker. The number of the +``jumbo patch'' that applies is 101409-03. Thanks to Russell Street +(r.street@@auckland.ac.nz) for this info. + +@cindex IRIX, installing collect +It appears that on IRIX, the collect2 program is not being installed +by default during the installation process, though it is required; +you can install it manually by executing + +@example +make install-collect2 +@end example + +from the gcc source directory after installing the compiler. (I'm +not certain for which versions of gcc this problem occurs, and whether +it is still present). + +@node Strange assembler errors, Other problems building libg++, Global constructor problems, installation +@section Strange assembler errors when linking C++ programs + +``I've installed gcc and it seemed to go OK, but when I attempt to link +any C++ program, I'm getting strange errors from the assembler! How +can that be?'' + +The messages in question might look something like + +@example +as: "/usr/tmp/cca14605.s", line 8: error: statement syntax +as: "/usr/tmp/cca14605.s", line 14: error: statement syntax +@end example + +(on a Sun, different on other platforms). The important thing is that +the errors come out at the link step, @emph{not} when a C++ file is +being compiled. + +@cindex nm program +@cindex GNU nm program +Here's what's going on: the collect2 program uses the Unix ``nm'' +program to obtain a list of symbols for the global constructors and +destructors, and it builds a little assembly language module that +will permit them all to be called. If you're seeing this symptom, +you have an old version of GNU nm somewhere on your path. This old +version prints out symbol names in a format that the collect2 program +does not expect, so bad assembly code is generated. + +The solution is either to remove the old version of GNU nm from your +path (and that of everyone else who uses g++), or to install a newer +version (it is part of the GNU "binutils" package). Recent versions +of GNU nm do not have this problem. + +@node Other problems building libg++, More size_t problems, Strange assembler errors, installation +@section Other problems building libg++ +@cindex libg++ on Ultrix +@cindex libg++ on SunOS + +``I am having trouble building libg++. Help!'' + +On some platforms (for example, Ultrix), you may see errors complaining +about being unable to open dummy.o. On other platforms (for example, +SunOS), you may see problems having to do with the type of size_t. +The fix for these problems is to make libg++ by saying "make CC=gcc". +According to Per Bothner, it should no longer be necessary to specify +"CC=gcc" for libg++-2.3.1 or later. + +``I built and installed libg++, but g++ can't find it. Help!'' + +The string given to @file{configure} that identifies your system must +be the same when you install libg++ as it was when you installed gcc. +Also, if you used the @code{--prefix} option to install gcc somewhere +other than @file{/usr/local}, you must use the same value for +@code{--prefix} when installing libg++, or else g++ will not be able +to find libg++. + +@cindex patch for libg++-2.6.2 + +The toplevel Makefile in the libg++ 2.6.2 distribution is broken, which +along with a bug in g++ 2.6.3 causes problems linking programs that use the +libstdc++ complex classes. A patch for this is available from +@file{ftp://ftp.cygnus.com//pub/g++/libg++-2.6.2-fix.gz}. + +@node More size_t problems, Rebuild libg++?, Other problems building libg++, installation +@section But I'm @emph{still} having problems with @code{size_t}! + +@cindex Type of size_t +``I did all that, and I'm @emph{still} having problems with disagreeing +definitions of size_t, SIZE_TYPE, and the type of functions like +@code{strlen}.'' + +@cindex _G_config.h +The problem may be that you have an old version of @file{_G_config.h} +lying around. As of libg++ version 2.4, @file{_G_config.h}, since it is +platform-specific, is inserted into a different directory; most include +files are in @file{$prefix/lib/g++-include}, but this file now lives in +@file{$prefix/$arch/include}. If, after upgrading your libg++, you find that +there is an old copy of @file{_G_config.h} left around, remove it, +otherwise g++ will find the old one first. + +@node Rebuild libg++?, co-existing versions, More size_t problems, installation +@section Do I need to rebuild libg++ to go with my new g++? + +``After I upgraded g++ to the latest version, I'm seeing undefined +symbols.'' + +or + +``If I upgrade to a new version of g++, do I need to reinstall libg++?'' + +@cindex Incompatibilities between g++ versions + +As a rule, the first two digits of your g++ and libg++ should be the +same. Normally when you do an upgrade in the ``minor version number'' +(2.5.7 to 2.5.8, say) there isn't a need to rebuild libg++, but there +have been a couple of exceptions in the past. + +@node co-existing versions, Installing on Linux, Rebuild libg++?, installation +@section I want several versions of g++ and libg++ to co-exist. + +I recommend against using the @code{-V} flag to make multiple versions +of gcc/g++ co-exist, unless they are different minor releases that can use +the same compiled version of libg++. The reason is that all these +versions will try to use the same libg++ version, which usually will +not work. + +Instead, use the @code{--prefix} flag when configuring gcc. Use a +different value of @code{--prefix} for each gcc version. Use the +same value of @code{--prefix} when configuring libg++. You can then +have any number of co-existing gcc/libg++ pairs. Symbolic links can +be used so that users don't need to put all these different directories +on their paths. + +One possible system to use is to set @code{--prefix} to +@file{/usr/local/gcc-2.x.y} for version 2.x.y of gcc, and to link +whichever version of gcc you wish to be the default into +@file{/usr/local/bin/gcc} and @file{/usr/local/bin/g++}. + +@node Installing on Linux, Linux Slackware 3.0, co-existing versions, installation +@section Trouble installing g++ and libg++ on Linux + +``I've downloaded the latest g++ and libg++ and I'm trying to install +them on Linux, and I'm having lots of problems.'' + +@cindex Linux +FSF releases of libg++ won't install on Linux unchanged, since Linux +uses are part of the libio library from libg++ for its standard C +library, only this is changed in a way that it clashes with libg++. +This means that you'll need a patched version of libg++ for it to +work. + +If you want to upgrade to a new gcc/libg++ combination, the easiest +thing to do is to grab the prebuilt versions of gcc and libg++ for Linux +from @file{ftp://tsx-11.mit.edu/pub/linux/packages/GCC}. Follow the +directions carefully. If you want to build from source, you'll need +a patch for libg++; the Linux developers have named the patched libg++ +version libg++-2.7.1.3 and there is a patch file in the above-named +directory. + +See @file{http://sunsite.unc.edu/LDP/HOWTO/GCC-HOWTO.html}, +the Linux GCC HOWTO, for more on gcc/g++ and Linux. + +Linux is in the process of switching over to the GNU C library, version +2, which will become Linux libc version 6. Once this process is +complete, there's a good chance that the installation process on Linux +will be smoother, but only experts should try making this new library +work at this point. + +@node Linux Slackware 3.0, , Installing on Linux, installation +@section Problems with g++ on Linux Slackware 3.0 + +@cindex Slackware +@cindex Linux Slackware +``When I try to compile the traditional Hello, world program on Linux, +the compiler can't find @file{iostream.h}. What's the deal?'' + +You probably have the Slackware 3.0 release. There's an error in the +setup. It's easy to fix, though; log in as root, and make a symbolic +link: + +@example +ln -s /usr/lib/g++-include /usr/include/g++ +@end example + +@node evolution, User Problems, installation, Top +@chapter The Evolution of g++ + +This chapter discusses the evolution of g++ and describes what can be expected +in the future. + +@menu +* version 2.7.x:: What's changed in 2.7.x from earlier versions +* libstdc++:: +@end menu + +@node version 2.7.x, libstdc++, evolution, evolution +@section What's new in version 2.7.x of gcc/g++ + +[ This section is old now, since 2.8.x/egcs is the new stuff ] The +latest 2.7.x version was 2.7.2.2, released February 10, 1997. The only +change between 2.7.2.1 and 2.7.2.2 is that support was added for using +the GNU C library, version 2, on Linux; users not interested in that +functionality have no reason to upgrade. The previous version of +gcc/g++ was 2.7.2.1, released August 14, 1996. The libg++ version that +should be used with any 2.7.x gcc/g++ is 2.7.2, released July 4, 1996. + +Note that gcc 2.7.2.1 just consists of several small patches to +gcc-2.7.2. The release is mainly +intended to fix platform-specific bugs and does not affect the C++ +``front end'' of the compiler (the part that parses your C++ code). + +The 2.7.x releases represent a great deal of work on the part of the g++ +maintainers to fix outstanding bugs and move the compiler closer to the +current ANSI/ISO standards committee's working paper, including +supporting many of the new features that have been added to the +language. I recommend that everyone read the NEWS file contained in the +distribution (and that system administrators make the file available to +their users). I've borrowed liberally from this file here. + +@cindex C++ working paper +If any features seem unfamiliar, you will probably want to +look at the recently-released public review copy of the C++ Working +Paper. A new draft, dated 2 December 1996, has been released for +public comment. You can find it on the web at +@file{http://www.cygnus.com/misc/wp/} or +@file{http://www.maths.warwick.ac.uk/c++/pub/wp/html/cd2/}. +See +@file{http://www.setech.com/x3.html} +or +@file{http://www.maths.warwick.ac.uk/c++/pub/} to download the +document in PostScript, PDF (Adobe Acrobat), HTML, or ASCII +form. + +Here are the main points: + +@itemize @bullet +@item +@cindex for scope +As described above, the scope of variables declared in the +initialization part of a for statement has been changed; such variables +are now visible only in the loop body. Use @code{-fno-for-scope} to get +the old behavior. You'll need this flag to build groff version 1.09, +Ptolemy, and many other free software packages. + +@item +@cindex vtable duplication +Code that does not use #pragma interface/implementation will most +likely shrink dramatically, as g++ now only emits the vtable for a +class in the translation unit where its first non-inline, non-abstract +virtual function is defined. + +@item +@cindex automatic template instantiation +Support for automatic template instantiation has @emph{not} been enabled +in the official distribution, due to a disagreement over design philosophies. +But you can get a patch from Cygnus to turn it on; retrieve the patch +from @file{ftp://ftp.cygnus.com/pub/g++/gcc-2.7.2-repo.gz} to patch +gcc-2.7.2 (there are also patches for earlier gcc versions). + +@item +@cindex exception handling, 2.7.0 + +@xref{exceptions} + +@item +@cindex run-time type identification +Support for Run-Time Type Identification has been added with @code{-frtti}. +This support is still in alpha; one major restriction is that any file +compiled with @code{-frtti} must include @code{<typeinfo>} (@emph{not} +@code{typeinfo.h} as the NEWS file says). +Also, all C++ code you link with (including libg++) has to be built with +@code{-frtti}, so it's still tricky to use. + +@item +@cindex compiler-generated operators +Synthesis of compiler-generated constructors, destructors and +assignment operators is now deferred until the functions are used. + +@item +@cindex assignment in conditional expressions +The parsing of expressions such as @code{a ? b : c = 1} +has changed from +@code{(a ? b : c) = 1} to @code{a ? b : (c = 1)}. This is a new C/C++ +incompatibility brought to you by the ANSI/ISO standards committee. + +@item +@cindex new operator keywords +The operator keywords and, and_eq, bitand, bitor, compl, not, not_eq, +or, or_eq, xor and xor_eq are now supported. Use @code{-ansi} or +@code{-foperator-names} to enable them. + +@item +@cindex explicit keyword +The @code{explicit} keyword is now supported. @code{explicit} is used to mark +constructors and type conversion operators that should not be used +implicitly. + +@item +@cindex user-defined type conversion +Handling of user-defined type conversion has been improved. + +@item +@cindex explicit template instantiation +Explicit instantiation of template methods is now supported. Also, +@code{inline template class foo<int>;} +can be used to emit only the vtable +for a template class. + +@item +@cindex -fcheck-new +With -fcheck-new, g++ will check the return value of all calls to +operator new, and not attempt to modify a returned null pointer. + +@item +collect2 now demangles linker output, and c++filt has become part of +the gcc distribution. + +@item +Improvements to template instantiation: only members actually used +are instantiated. (Actually this is not quite true: some inline +templates that are not successfully inlined may be expanded even +though they are not needed). + +@end itemize + +@node libstdc++, , version 2.7.x, evolution +@section The GNU Standard C++ Library + +The GNU Standard C++ Library (also called the ``GNU ANSI C++ Library'' +in places in the code) is not libg++, though it is included in the +libg++ distribution. Rather, it contains classes and functions +required by the ANSI/ISO standard. The copyright conditions are the +same as those for for the iostreams classes; the LGPL is not used +(@pxref{legalities}). + +This library, libstdc++, is in the libg++ distribution in versions 2.6.2 +and later. It requires at least gcc 2.6.3 to build the libg++-2.6.2 +version; use at least gcc 2.7.0 to build the libg++ 2.7.0 version. It +contains a hacked-up version of HP's implementation of the Standard +Template Library (@pxref{Standard Template Library}). I've +successfully used this Standard Template Library version to build +a number of the demos you'll see on various web pages. + +As of version 2.7.0, the streams classes are now in libstdc++ instead of +libg++, and libiostream is being phased out (don't use it). The g++ +program searches this library. + +The maintainers of libg++ have de-emphasized work on the older libg++ classes +in favor of enhancing libstdc++ to cover the full language, so while libg++ +will always be available, enhancements to it should not be expected. + +@node User Problems, legalities, evolution, Top +@chapter User Problems + +@menu +* missing virtual table:: +* for scope:: +* const constructor:: +* unused parameter warnings:: +* jump crosses initialization:: +* Demangler:: +* static data members:: +* internal compiler error:: +* bug reports:: +* porting to g++:: +* name mangling:: +* problems linking with other libraries:: +* documentation:: +* templates:: +* undefined templates:: +* redundant templates:: +* Standard Template Library:: +* STL and string:: +* exceptions:: +* namespaces:: +* agreement with standards:: +* compiling standard libraries:: +* debugging on SVR4 systems:: +* debugging problems on Solaris:: +* X11 conflicts with libg++:: +* assignment to streams:: +@end menu + +@node missing virtual table, for scope, User Problems, User Problems +@section Linker complains about missing virtual table + +``I'm getting a message complaining about an undefined virtual table. Is +this a compiler bug?'' + +(On platforms that run neither collect nor the GNU linker, like Solaris, +you may see an odd undefined symbol like "_vt.3foo", where foo is a +class name). + +This is probably because you are missing a definition for the first +(non-inline) virtual function of the class. Since gcc-2.7.0, g++ uses +a trick borrowed from cfront: the .o file containing the definition for +the first non-inline virtual function for the class will also contain +the virtual function table. + +@node for scope, const constructor, missing virtual table, User Problems +@section gcc-2.7.0 breaks declarations in "for" statements! + +@cindex declarations in for statements +@cindex for statements: declarations + +gcc-2.7.0 implements the new ANSI/ISO rule on the scope of variables +declared in for loops. + +@example +for (int i = 1; i <= 10; i++) @{ + // do something here +@} +foo(i); +@end example + +In the above example, most existing C++ compilers would pass the +value 11 to the function @code{foo}. In gcc 2.7 and in the ANSI/ISO +working paper, the scope of @code{i} is only the for loop body, so +this is an error. So that old code can be compiled, the new gcc has +a flag @code{-fno-for-scope} that causes the old rule to be used. +@cindex -fno-for-scope + +As of 2.7.1, the compiler attempts to issue warnings about code that +has different meanings under the two sets of rules, but the code is +not perfect: the intent was that code that has valid, but different, +meanings under the ARM rules and the working paper rules would give +warnings but have the new behavior, and this doesn't seem to happen. + +The @code{-ffor-scope} flag under 2.7.1 and 2.7.2 gives the 2.7.0 behavior. + +@node const constructor, unused parameter warnings, for scope, User Problems +@section g++ seems to want a const constructor. What's that? + +gcc-2.7.1 introduced a bug that causes the compiler to ask for a +const constructor (there's no such thing in C++) in certain situations +where a const object appears in a template class. Most cases have been +fixed in gcc-2.7.2, but unfortunately not all. Still, if you're running +gcc-2.7.1 and have this problem, upgrade to 2.7.2; it is a vast improvement. + +@cindex ObjectSpace<STL> + +The default constructor for the template @code{pair} in ObjectSpace's +implementation of STL triggers the bug in one place, for gcc 2.7.2. If +you're using ObjectSpace<STL> and having this problem, simply +change the default constructor from + +@example +os_pair () : first (T1 ()), second (T2 ()) @{@} +@end example + +to just + +@example +os_pair () @{@} +@end example + +Once this is done, ObjectSpace<STL> works fairly well. + +@node unused parameter warnings, jump crosses initialization, const constructor, User Problems +@section How to silence ``unused parameter'' warnings + +@cindex -Wall +@cindex -Wunused + +``When I use @code{-Wall} (or @code{-Wunused}), g++ warns about +unused parameters. But the parameters have to be there, for use +in derived class functions. How do I get g++ to stop complaining?'' + +The answer is to simply omit the names of the unused parameters when +defining the function. This makes clear, both to g++ and to readers +of your code, that the parameter is unused. For example: + +@example +int Foo::bar(int arg) @{ return 0; @} +@end example + +will give a warning for the unused parameter @code{arg}. To suppress +the warning write + +@example +int Foo::bar(int) @{ return 0; @} +@end example + +@node jump crosses initialization, Demangler, unused parameter warnings, User Problems +@section g++ objects to a declaration in a case statement + +``The compiler objects to my declaring a variable in one of the branches +of a case statement. Earlier versions used to accept this code. Why?'' + +The draft standard does not allow a goto or a jump to a case label to +skip over an initialization of a variable or a class object. For +example: + +@example +switch ( i ) @{ + case 1: + Object obj(0); + ... + break; + case 2: + ... + break; +@} +@end example + +The reason is that @code{obj} is also in scope in the rest of the switch +statement. + +As of version 2.7.0, the compiler will object that the jump to the +second case level crosses the initialization of @code{obj}. Older +compiler versions would object only if class Object has a destructor. +In either case, the solution is to add a set of curly braces around +the case branch: + +@example + case 1: + @{ + Object obj(0); + ... + break; + @} +@end example + +@node Demangler, static data members, jump crosses initialization, User Problems +@section Where can I find a demangler? + +@cindex demangler program +A g++-compatible demangler named @code{c++filt} can be found in the +@file{binutils} distribution. This distribution (which also contains +the GNU linker) can be found at any GNU archive site. + +As of version 2.7.0, @code{c++filt} is included with gcc and is +installed automatically. Even better, it is used by the @code{collect} +linker, so you don't see mangled symbols anymore (except on platforms +that use neither collect nor the GNU linker, like Solaris). + +@node static data members, internal compiler error, Demangler, User Problems +@section Linker reports undefined symbols for static data members + +@cindex Static data members +``g++ reports undefined symbols for all my static data members when I link, +even though the program works correctly for compiler XYZ. What's going on?'' + +The problem is almost certainly that you don't give definitions for +your static data members. If you have + +@example +class Foo @{ + ... + void method(); + static int bar; +@}; +@end example + +you have only declared that there is an int named Foo::bar and a member +function named Foo::method that is defined somewhere. You still need to +define @emph{both} method() and bar in some source file. According to +the draft ANSI standard, you must supply an initializer, such as + +@example +int Foo::bar = 0; +@end example + +@noindent +in one (and only one) source file. + +@node internal compiler error, bug reports, static data members, User Problems +@section What does ``Internal compiler error'' mean? + +It means that the compiler has detected a bug in itself. Unfortunately, +g++ still has many bugs, though it is a lot better than it used to be. +If you see this message, please send in a complete bug report (see next +section). + +@node bug reports, porting to g++, internal compiler error, User Problems +@section I think I have found a bug in g++. + +@cindex Bug in g++, newly found +``I think I have found a bug in g++, but I'm not sure. How do I know, +and who should I tell?'' + +@cindex Manual, for gcc +First, see the excellent section on bugs and bug reports in the gcc manual +(which is included in the gcc distribution). As a short summary of that +section: if the compiler gets a fatal signal, for any input, it's a bug +(newer versions of g++ will ask you to send in a bug report when they +detect an error in themselves). Same thing for producing invalid +assembly code. + +When you report a bug, make sure to describe your platform (the type of +computer, and the version of the operating system it is running) and the +version of the compiler that you are running. See the output of the +command @code{g++ -v} if you aren't sure. Also provide enough code +so that the g++ maintainers can duplicate your bug. Remember that the +maintainers won't have your header files; one possibility is to send +the output of the preprocessor (use @code{g++ -E} to get this). This +is what a ``complete bug report'' means. + +I will add some extra notes that are C++-specific, since the notes from +the gcc documentation are generally C-specific. + +@cindex g++ bug report +First, mail your bug report to "bug-g++@@prep.ai.mit.edu". You may also +post to @file{gnu.g++.bug}, but it's better to use mail, particularly if you +have any doubt as to whether your news software generates correct reply +addresses. Don't mail C++ bugs to bug-gcc@@prep.ai.mit.edu. + +@strong{News:} as I write this (late February 1996) the gateway +connecting the bug-g++ mailing list and the @file{gnu.g++.bug} newsgroup +is (temporarily?) broken. Please mail, do not post bug reports. + +@cindex libg++ bug report +If your bug involves libg++ rather than the compiler, mail to +bug-lib-g++@@prep.ai.mit.edu. If you're not sure, choose one, and if you +guessed wrong, the maintainers will forward it to the other list. + +@cindex C++, reference books +@cindex ARM [Annotated C++ Ref Manual] +Second, if your program does one thing, and you think it should do +something else, it is best to consult a good reference if in doubt. +The standard reference is the draft working paper from the ANSI/ISO +C++ standardization committee, which you can get on the net. +For PostScript and PDF (Adobe Acrobat) versions, see the +archive at @file{ftp://research.att.com/dist/stdc++/WP}. For HTML and ASCII +versions, see @file{ftp://ftp.cygnus.com/pub/g++}. On the World Wide Web, see +@file{http://www.cygnus.com/misc/wp/}. + +An older +standard reference is "The Annotated C++ Reference Manual", by Ellis and +Stroustrup (copyright 1990, ISBN #0-201-51459-1). This is what they're +talking about on the net when they refer to ``the ARM''. But you should +know that vast changes have been made to the language since then. + +The ANSI/ISO C++ standards committee have adopted some changes to the +C++ language since the publication of the original ARM, and newer +versions of g++ (2.5.x and later) support some of these changes, notably +the mutable keyword (added in 2.5.0), the bool type (added in 2.6.0), +and changes in the scope of variables defined in for statements (added +in 2.7.0). +You can obtain an addendum to the ARM explaining many of these changes by FTP +from @file{ftp://ftp.std.com/AW/stroustrup2e/new_iso.ps}. + +@cindex AT&T cfront +Note that the behavior of (any version of) AT&T's "cfront" compiler is +NOT the standard for the language. + +@node porting to g++, name mangling, bug reports, User Problems +@section Porting programs from other compilers to g++ + +``I have a program that runs on <some other C++ compiler>, and I want +to get it running under g++. Is there anything I should watch out +for?'' + +@cindex Porting to g++ + +Note that g++ supports many of the newer keywords that have recently +been added to the language. Your other C++ compiler may not support +them, so you may need to rename variables and members that conflict +with these keywords. + +There are two other reasons why a program that worked under one compiler +might fail under another: your program may depend on the order of +evaluation of side effects in an expression, or it may depend on the +lifetime of a temporary (you may be assuming that a temporary object +"lives" longer than the standard guarantees). As an example of the +first: + +@example +void func(int,int); + +int i = 3; +func(i++,i++); +@end example + +@cindex Order of evaluation, problems in porting +Novice programmers think that the increments will be evaluated in strict +left-to-right order. Neither C nor C++ guarantees this; the second +increment might happen first, for example. func might get 3,4, or it +might get 4,3. + +@cindex Classes, problems in porting +@cindex Problems in porting, class +The second problem often happens with classes like the libg++ String +class. Let's say I have + +@example +String func1(); +void func2(const char*); +@end example + +and I say + +@example +func2(func1()); +@end example + +because I know that class String has an "operator const char*". So what +really happens is + +@example +func2(func1().convert()); +@end example + +@cindex temporaries +where I'm pretending I have a convert() method that is the same as the +cast. This is unsafe in g++ versions before 2.6.0, because the +temporary String object may be deleted after its last use (the call to +the conversion function), leaving the pointer pointing to garbage, so by +the time func2 is called, it gets an invalid argument. + +@cindex ANSI draft standard +Both the cfront and the old g++ behaviors are legal according to the ARM, +but the powers that be have decided that compiler writers were given +too much freedom here. + +The ANSI C++ committee has now come to a resolution of the lifetime of +temporaries problem: they specify that temporaries should be deleted at +end-of-statement (and at a couple of other points). This means that g++ +versions before 2.6.0 now delete temporaries too early, and cfront +deletes temporaries too late. As of version 2.6.0, g++ does things +according to the new standard. + +@cindex Scope, problems in porting +@cindex Problems in porting, scope +For now, the safe way to write such code is to give the temporary a name, +which forces it to live until the end of the scope of the name. For +example: + +@example +String& tmp = func1(); +func2(tmp); +@end example + +Finally, like all compilers (but especially C++ compilers, it seems), +g++ has bugs, and you may have tweaked one. If so, please file a bug +report (after checking the above issues). + +@node name mangling, problems linking with other libraries, porting to g++, User Problems +@section Why does g++ mangle names differently from other C++ compilers? + +See the answer to the next question. +@cindex Mangling names + +@node problems linking with other libraries, documentation, name mangling, User Problems +@section Why can't g++ code link with code from other C++ compilers? + +``Why can't I link g++-compiled programs against libraries compiled by +some other C++ compiler?'' + +@cindex Mangling names +@cindex Cygnus Support +Some people think that, +if only the FSF and Cygnus Support folks would stop being +stubborn and mangle names the same way that, say, cfront does, then any +g++-compiled program would link successfully against any cfront-compiled +library and vice versa. Name mangling is the least of the problems. +Compilers differ as to how objects are laid out, how multiple inheritance +is implemented, how virtual function calls are handled, and so on, so if +the name mangling were made the same, your programs would link against +libraries provided from other compilers but then crash when run. For this +reason, the ARM @emph{encourages} compiler writers to make their name mangling +different from that of other compilers for the same platform. +Incompatible libraries are then detected at link time, rather than at run +time. +@cindex ARM [Annotated C++ Ref Manual] +@cindex Compiler differences + +@node documentation, templates, problems linking with other libraries, User Problems +@section What documentation exists for g++ 2.x? + +@cindex g++, documentation +Relatively little. +While the gcc manual that comes with the distribution has some coverage +of the C++ part of the compiler, it focuses mainly on the C compiler +(though the information on the ``back end'' pertains to C++ as well). +Still, there is useful information on the command line options and the +#pragma interface and #pragma implementation directives in the manual, +and there is a useful section on template instantiation in the 2.6 version. +There is a Unix-style manual entry, "g++.1", in the gcc-2.x +distribution; the information here is a subset of what is in the manual. + +You can buy a nicely printed and bound copy of this manual from the FSF; +see above for ordering information. + +A draft of a document describing the g++ internals appears in the gcc +distribution (called g++int.texi); it is incomplete but gives lots of +information. + +For class libraries, there are several resources available: + +@itemize @bullet +@item +The libg++ distribution has a manual +@file{libg++/libg++.texi} describing the old libg++ classes, and +another manual @file{libio/iostream.texi} describing the iostreams +implementation. +@item +While there is no libg++-specific document describing the STL +implementation, SGI's web site, at +@file{http://www.sgi.com/Technology/STL/}, is an excellent resource. +Note that the SGI version of STL is the one that is included with the +egcs and 2.8.x releases of g++/libstdc++. + +@end itemize + +@node templates, undefined templates, documentation, User Problems +@section Problems with the template implementation + +@cindex g++, template support +@cindex Templates + +g++ does not implement a separate pass to instantiate template functions +and classes at this point; for this reason, it will not work, for the most +part, to declare your template functions in one file and define them in +another. The compiler will need to see the entire definition of the +function, and will generate a static copy of the function in each file +in which it is used. + +(The experimental template repository code (@pxref{repository}) that +can be added to 2.7.0 or later does implement a separate pass, but there +is still no searching of files that the compiler never saw). + +As of 2.8.x and egcs-1.0.x, the template implementation has most +of the features specified in the draft standard. Still missing are +template arguments that are themselves templates; however, template +class member functions work, and most of the limitations of the older +g++ versions are fixed. + +I think that given this new implementation, it should not be necessary +for users to mess around with switches like @code{-fno-implicit-templates} +and @code{#pragma} directives; most of the time, the default behavior +will work OK. Users of older versions might want to read on. + +@cindex -fno-implicit-templates +For version 2.6.0, however, a new switch @code{-fno-implicit-templates} +was added; with this switch, templates are expanded only under user +control. I recommend that all g++ users that use templates read the +section ``Template Instantiation'' in the gcc manual (version 2.6.x +and newer). g++ now supports explicit template expansion using the +syntax from the latest C++ working paper: + +@example +template class A<int>; +template ostream& operator << (ostream&, const A<int>&); +@end example + +@cindex template limitations +As of version 2.7.2, there are still a few limitations in the template +implementation besides the above (thanks to Jason Merrill for this info): + +@strong{Note}: these problems are eliminated in egcs and in gcc-2.8.x. + +@enumerate 1 +@item +Static data member templates are not supported in compiler versions older +than 2.8.0. You can work around +this by explicitly declaring the static variable for each template +specialization: + +@example +template <class T> struct A @{ + static T t; +@}; + +template <class T> T A<T>::t = 0; // gets bogus error +int A<int>::t = 0; // OK (workaround) +@end example + +@item +Template member names are not available when defining member function +templates. + +@example +template <class T> struct A @{ + typedef T foo; + void f (foo); + void g (foo arg) @{ ... @}; // this works +@}; + +template <class T> void A<T>::f (foo) @{ @} // gets bogus error +@end example + +@item +Templates are instantiated using the parser. This results in two +problems (again, these problems are fixed in 2.8.0 and egcs): + +a) Class templates are instantiated in some situations where such +instantiation should not occur. + +@example +template <class T> class A @{ @}; +A<int> *aip = 0; // should not instantiate A<int> (but does) +@end example + +b) Function templates cannot be inlined at the site of their +instantiation. + +@example +template <class T> inline T min (T a, T b) @{ return a < b ? a : b; @} + +void f () @{ + int i = min (1, 0); // not inlined +@} + +void g () @{ + int j = min (1, 0); // inlined +@} +@end example + +A workaround that works in version 2.6.1 through 2.7.2.x is to specify + +@example +extern template int min (int, int); +@end example + +before @code{f()}; this will force it to be instantiated (though not +emitted). + +@strong{Note:} this kind of ``guiding declaration'' is not standard and +isn't supported by egcs or gcc-2.8.x, as the standard says that this +declares a ``normal'' @code{min} function which has no relation to +the template function @code{min<int>(int,int)}. But then the new +compilers have no problem inlining template functions. + +@item +Member function templates are always instantiated when their containing +class is. This is wrong (fixed in egcs/2.8). +@end enumerate + +@node undefined templates, redundant templates, templates, User Problems +@section I get undefined symbols when using templates + +(Thanks to Jason Merrill for this section). + +@cindex template instantiation +g++ does not automatically instantiate templates defined in other files. +Because of this, code written for cfront will often produce undefined +symbol errors when compiled with g++. You need to tell g++ which template +instances you want, by explicitly instantiating them in the file where they +are defined. For instance, given the files + +@file{templates.h}: +@example +template <class T> +class A @{ +public: + void f (); + T t; +@}; + +template <class T> void g (T a); +@end example + +@file{templates.cc}: +@example +#include "templates.h" + +template <class T> +void A<T>::f () @{ @} + +template <class T> +void g (T a) @{ @} +@end example + + +main.cc: +@example +#include "templates.h" + +main () +@{ + A<int> a; + a.f (); + g (a); +@} +@end example + +compiling everything with @code{g++ main.cc templates.cc} will result in +undefined symbol errors for @samp{A<int>::f ()} and @samp{g (A<int>)}. To +fix these errors, add the lines + +@example +template class A<int>; +template void g (A<int>); +@end example + +to the bottom of @samp{templates.cc} and recompile. + +@node redundant templates, Standard Template Library, undefined templates, User Problems +@section I get multiply defined symbols using templates + +You may be running into a bug that was introduced in version 2.6.1 +(and is still present in 2.6.3) that generated external linkage +for templates even when neither @code{-fexternal-templates} nor +@code{-fno-implicit-templates} is specified. There is a patch for +this problem at @* +@file{ftp://ftp.cygnus.com/pub/g++/gcc-2.6.3-template-fix}. + +I recommend either applying the patch or +using @code{-fno-implicit-templates} +together with explicit template instantiation as described in previous +sections. + +This bug is fixed in 2.7.0. + +@node Standard Template Library, STL and string, redundant templates, User Problems +@section Does g++ support the Standard Template Library? + +If you want to use the Standard Template Library, do not pass go, +upgrade immediately to gcc-2.8.x or to egcs. The new C++ front end +handles STL very well, and the high-quality implementation of STL +from SGI is included verbatim as part of the libstdc++ class library. + +If for some reason you must use 2.7.2, you can probably get by with +the hacked-up version of the old implementation from HP that is +included with libg++-2.7.2, but it is definitely inferior and has more +problems. Alternatively, g++ 2.7.2.x users might try the following: +a group at the Moscow Center for Sparc Technology has +a port of the SGI STL implementation that mostly works with gcc-2.7.2. +See +@file{http://www.ipmce.su/people/fbp/stl/stlport.html}. + +Mumit Khan has produced an ``STL newbie guide'' with lots of information +on using STL with gcc. See + +@file{http://www.xraylith.wisc.edu/~khan/software/stl/STL.newbie.html} + +@node STL and string, exceptions, Standard Template Library, User Problems +@section I'm having problems mixing STL and the standard string class + +[ This section is for g++ 2.7.2.x users only ] + +This is due to a bug in g++ version 2.7.2 and 2.7.2.1; the compiler +is confused by the operator declarations. There is an easy workaround, +however; just make sure that the @code{<string>} header is included +before any STL headers. That is, just say + +@example +#include <string> +@end example + +before any other @code{#include} directives. + +Unfortunately, this doesn't solve all problems; you may still have +difficulty with the relational operators !=, <=, >, and >=, thanks +to a conflict with the very general definition of these operators +in function.h. One trick that sometimes works is to try to use == +and < in your code instead of the other operators. Another is to +use a derived class of <string>. The only completely satisfactory +solution, I'm afraid, is to wait for the new release. + +@node exceptions, namespaces, STL and string, User Problems +@section Problems and limitations with exceptions + +The first really usable exceptions implementations are in 2.8.x and +egcs. With these versions, exceptions are enabled by default; use +-fno-exceptions to disable exceptions. + +However, 2.8.1 still has not integrated egcs work that computes an +accurate control flow graph in the presence of exceptions. For this +reason, you will sometimes get bogus warnings when compiling with 2.8.1, +-O, and -Wall, about uninitialized variables and the like. + +2.7.2.x has very limited and partially broken support for exceptions. +With that compiler, you must +provide the @code{-fhandle-exceptions} flag to enable exception +handling. In version 2.7.2 and older, exceptions may not work properly +(and you may get odd error messages when compiling) if you turn +on optimization (the @code{-O} flag). If you care about exceptions, +please upgrade to a newer compiler! + +In 2.7.2, you must give the @code{-frtti} switch to enable catching +of derived exception objects with handlers for the base exception class; +if @code{-frtti} is not given, only exact type matching works. + +For exception handling to work with 2.7.0 your CPU must be a SPARC, +RS6000/PowerPC, 386/486/Pentium, or ARM. Release 2.7.1 added support +for the Alpha, and ``m68k is rumored to work on some platforms'' +and ``VAX may also work'' (according to Mike Stump). +@emph{It still doesn't work on HP-PA or MIPS platforms.} + +Exception handling adds space overhead (the size of the executable +grows); the problem is worse on the ix86 (Intel-like) architecture +than on RISC architectures. The extra exceptions code is generated +in a separate program section and is only paged in if an exception +is thrown, so the cost is in disk, not in RAM or CPU. + +Exception overhead is much lower on ix86 if you use binutils 2.9 or +later, as gas (the GNU assembler) can now compress the information. + +@node namespaces, agreement with standards, exceptions, User Problems +@section Does g++ support namespaces? + +As of version 2.7.2, g++ recognizes the keywords @code{namespace} and +@code{using}, and there is some rudimentary code present, but almost +nothing connected with namespaces works yet. +The new versions (2.8.x/egcs) still lack namespace support, but to help +compile standard programs they make + +@example +using namespace std; +@end example + +a no-op. There is namespace implementation work going on in the egcs +snapshots (but it hasn't been released yet). + +@node agreement with standards, compiling standard libraries, namespaces, User Problems +@section What are the differences between g++ and the ARM specification of C++? + +@cindex ARM [Annotated C++ Ref Manual] +@cindex exceptions + +Up until recently, there was no really usable exception support. If you +need exceptions, you want gcc-2.8.x or egcs. The implementation works +fairly well. The 2.7.x version was strictly alpha quality and quite +fragile. + +@cindex mutable +Some features that the ANSI/ISO standardization committee has voted in +that don't appear in the ARM are supported, notably the @code{mutable} +keyword, in version 2.5.x. 2.6.x added support for the built-in boolean +type @code{bool}, with constants @code{true} and @code{false}. Run-time +type identification was rudimentary in 2.7.x but is fully supported in +2.8.x, so there are +more reserved words: @code{typeid}, @code{static_cast}, +@code{reinterpret_cast}, @code{const_cast}, and @code{dynamic_cast}. + +@cindex g++ bugs +As with any beta-test compiler, there are bugs. You can help improve +the compiler by submitting detailed bug reports. + +[ This paragraph obsoleted by 2.8.x/egcs: ] +One of the weakest areas of g++ other than templates is the resolution +of overloaded functions and operators in complex cases. The usual +symptom is that in a case where the ARM says that it is ambiguous which +function should be chosen, g++ chooses one (often the first one +declared). This is usually not a problem when porting C++ code from +other compilers to g++, but shows up as errors when code developed under +g++ is ported to other compilers. (I believe this is no longer a +significant problem in 2.7.0 or later). + +[A full bug list would be very long indeed, so I won't put one here; +the sheer complexity of the C++ language means that every compiler I've +tried has some problems. 2.8.x and egcs are a big improvement] + +@node compiling standard libraries, debugging on SVR4 systems, agreement with standards, User Problems +@section Will g++ compile InterViews? The NIH class library? Rogue Wave? + +@cindex NIH class library +@cindex NIHCL with g++ +The NIH class library uses a non-portable, compiler-dependent hack +to initialize itself, which makes life difficult for g++ users. +It will not work without modification, and I don't know what modifications +are required or whether anyone has done them successfully. + +In short, it's not going to happen any time soon (previous FAQs referred +to patches that a new NIHCL release would hopefully contain, but this +hasn't happened). + +@strong{Note:} I thought I saw an item indicating that someone +@emph{had} patched NIHCL to work with g++. Any pointers? + +@cindex InterViews +I think that as of version 2.5.6, the standard g++ will compile the +standard 3.1 InterViews completely successfully. +Note that you'll need the @code{-fno-for-scope} flag +if you use gcc-2.7.0; with 2.7.2 you may be able to omit this flag +but you'll get warnings. + +@cindex Rogue Wave +According to Jason Merrill, gcc-2.7.0 and newer works with Rogue +Wave's @code{tools.h++} class library, but you may want to grab +@file{ftp://ftp.cygnus.com/pub/g++/Tools.h++-6.1-patch}. Again, +you'll need the @code{-fno-for-scope} flag since Rogue Wave hasn't +fixed their code to comply with the new standard yet. + +@node debugging on SVR4 systems, debugging problems on Solaris, compiling standard libraries, User Problems +@section Debugging on SVR4 systems +@cindex System VR4, debugging + +``How do I get debugging to work on my System V Release 4 system?'' + +@cindex DWARF debug format + +Most systems based on System V Release 4 (except Solaris) encode symbolic +debugging information in a format known as `DWARF'. There are two forms +of DWARF, DWARF 1 and DWARF 2. The default is often DWARF 1, which is +not really expressive enough to do C++ correctly. + +Now that we have gdb 4.17, DWARF debugging is finally supported (if +you use gcc 2.8.1 or egcs-1.0.x or newer). + +@cindex stabs +@cindex --with-stabs + +For users of older versions of the tools, you @emph{can} get g++ debugging under SVR4 systems by +configuring gcc with the @code{--with-stabs} option. This causes gcc to +use an alternate debugging format, one more like that used under SunOS4. +You won't need to do anything special to GDB; it will always understand +the ``stabs'' format. + +To specify DWARF 2 output on Unixware, you can give the @code{-ggdb} +switch; alternatively, @code{-gstabs} produces ``stabs'' format. + +@node debugging problems on Solaris, X11 conflicts with libg++, debugging on SVR4 systems, User Problems +@section debugging problems on Solaris + +``I'm on Solaris, and gdb says it doesn't know about some of my local +symbols. Help!'' + +This problem was introduced in gcc 2.7.2; debug symbols for +locals that aren't declared at the beginning of a block come out in the +wrong order, and gdb can't find such symbols. + +This problem is fixed in gcc-2.7.2.1. + +@node X11 conflicts with libg++, assignment to streams, debugging problems on Solaris, User Problems +@section X11 conflicts with libg++ in definition of String +@cindex String, conflicts in definition + +``X11 and Motif define String, and this conflicts with the String class +in libg++. How can I use both together?'' + +One possible method is the following: + +@example +#define String XString +#include <X11/Intrinsic.h> +/* include other X11 and Motif headers */ +#undef String +@end example + +and remember to use the correct @code{String} or @code{XString} when +you declare things later. + +@node assignment to streams, , X11 conflicts with libg++, User Problems +@section Why can't I assign one stream to another? + +[ Thanks to Per Bothner and Jerry Schwarz for this section. ] + +Assigning one stream to another seems like a reasonable thing to do, but +it's a bad idea. Usually, this comes up because people want to assign +to @code{cout}. This is poor style, especially for libraries, and is +contrary to good object-oriented design. (Libraries that write directly +to @code{cout} are less flexible, modular, and object-oriented). + +The iostream classes do not allow assigning to arbitrary streams, because +this can violate typing: + +@example +ifstream foo ("foo"); +istrstream str(...); +foo = str; +foo->close (); /* Oops! Not defined for istrstream! */ +@end example + +@cindex assignment to cout + +The original cfront implementation of iostreams by Jerry Schwarz allows +you to assign to @code{cin}, @code{cout}, @code{cerr}, and @code{clog}, +but this is not part of the draft standard for iostreams and generally +isn't considered a good idea, so standard-conforming code shouldn't use +this technique. + +The GNU implementation of iostream did not support assigning to +@code{cin}, @code{cout}, @code{cerr}, and @code{clog} +for quite a while, but it now does, for backward +compatibility with cfront iostream (versions 2.6.1 and later of libg++). + +The ANSI/ISO C++ Working Paper does provide ways of changing the +streambuf associated with a stream. Assignment isn't allowed; +there is an explicit named member that must be used. + +However, it is not wise to do this, and the results are confusing. For +example: @code{fstream::rdbuf} is supposed to return the @emph{original} +filebuf, not the one you assigned. (This is not yet implemented in GNU +iostream.) This must be so because @code{fstream::rdbuf} is defined to +return a @code{filebuf *}. + +@node legalities, index, User Problems, Top +@chapter What are the rules for shipping code built with g++ and libg++? +@cindex Shipping rules +@cindex GPL [GNU Public License] + +``Is it is possible to distribute programs for profit that are created +with g++ and use the g++ libraries?'' + +I am not a lawyer, and this is not legal advice. In any case, I have +little interest in telling people how to violate the spirit of the +GNU licenses without violating the letter. This section tells you +how to comply with the intention of the GNU licenses as best I understand +them. + +@cindex FSF [Free Software Foundation] +The FSF has no objection to your making money. Its only interest is that +source code to their programs, and libraries, and to modified versions of +their programs and libraries, is always available. + +The short answer is that you do not need to release the source to +your program, but you can't just ship a stripped executable either, +unless you use only the subset of libg++ that includes the iostreams +classes (see discussion below) or the new libstdc++ library (available +in libg++ 2.6.2 and later). + +Compiling your code with a GNU compiler does not affect its copyright; +it is still yours. However, in order to ship code that links in a GNU +library such as libg++ there are certain rules you must follow. The +rules are described in the file COPYING.LIB that accompanies gcc +distributions; it is also included in the libg++ distribution. +See that file for the exact rules. The agreement is called the +Library GNU Public License or LGPL. It is much "looser" than the +GNU Public License, or GPL, that covers must GNU programs. + +@cindex libg++, shipping code +Here's the deal: let's say that you use some version of libg++, +completely unchanged, in your software, and you want to ship only +a binary form of your code. You can do this, but there are several +special requirements. If you want to use libg++ but ship only object +code for your code, you have to ship source for libg++ (or ensure +somehow that your customer already has the source for the exact +version you are using), and ship your application in linkable form. +You cannot forbid your customer from reverse-engineering or extending +your program by exploiting its linkable form. + +@cindex libg++, modifying +Furthermore, if you modify libg++ itself, you must provide source +for your modifications (making a derived class does not count as +modifying the library -- that is "a work that uses the library"). + +@cindex special copying conditions for iostreams +For certain portions of libg++ that implement required parts of the C++ +language (such as iostreams and other standard classes), the FSF has +loosened the copyright requirement still more by adding the ``special +exception'' clause, which reads as follows: + +@quotation +As a special exception, if you link this library with files +compiled with GCC to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. +@end quotation + +If your only use of libg++ uses code with this exception, you may ship +stripped executables or license your executables under different +conditions without fear of violating an FSF copyright. It is the intent +of FSF and Cygnus that, as the other classes required by the ANSI/ISO +draft standard are developed, these will also be placed under this +``special exception'' license. +The code in the new libstdc++ library, intended to implement standard +classes as defined by ANSI/ISO, is also licensed this way. + +To avoid coming under the influence of the LGPL, you can link with +@file{-liostream} rather than @file{-lg++} (for version 2.6.x and +earlier), or @file{-lstdc++} now that it is available. In version 2.7.0 +all the standard classes are in @file{-lstdc++}; you can do the link +step with @code{c++} instead of @code{g++} to search only the +@file{-lstdc++} library and avoid the LGPL'ed code in @file{-lg++}. + +Note that in egcs and in gcc-2.8.x, if you do not +specify any libraries the @code{g++} command will only link in +@file{-lstdc++}, so your executable will not be affected by the LGPL +(unless you link in some other LGPLed library: the GNU C library used +on GNU/Linux systems is one such library). + +If you wish to discuss legal issues connected with GNU software on the +net, please use @file{gnu.misc.discuss}, not the technical newsgroups. + +@node index, , legalities, Top +@comment node-name, next, previous, up +@appendix Concept Index + +@printindex cp + +@page +@contents +@bye |