1144 lines
49 KiB
Plaintext
1144 lines
49 KiB
Plaintext
This is Info file gcc.info, produced by Makeinfo version 1.68 from the
|
||
input file ../../gcc-2.95.2/gcc/gcc.texi.
|
||
|
||
INFO-DIR-SECTION Programming
|
||
START-INFO-DIR-ENTRY
|
||
* gcc: (gcc). The GNU Compiler Collection.
|
||
END-INFO-DIR-ENTRY
|
||
This file documents the use and the internals of the GNU compiler.
|
||
|
||
Published by the Free Software Foundation 59 Temple Place - Suite 330
|
||
Boston, MA 02111-1307 USA
|
||
|
||
Copyright (C) 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||
1999 Free Software Foundation, Inc.
|
||
|
||
Permission is granted to make and distribute verbatim copies of this
|
||
manual provided the copyright notice and this permission notice are
|
||
preserved on all copies.
|
||
|
||
Permission is granted to copy and distribute modified versions of
|
||
this manual under the conditions for verbatim copying, provided also
|
||
that the sections entitled "GNU General Public License" and "Funding
|
||
for Free Software" are included exactly as in the original, and
|
||
provided that the entire resulting derived work is distributed under
|
||
the terms of a permission notice identical to this one.
|
||
|
||
Permission is granted to copy and distribute translations of this
|
||
manual into another language, under the above conditions for modified
|
||
versions, except that the sections entitled "GNU General Public
|
||
License" and "Funding for Free Software", and this permission notice,
|
||
may be included in translations approved by the Free Software Foundation
|
||
instead of in the original English.
|
||
|
||
|
||
File: gcc.info, Node: Installation Problems, Next: Cross-Compiler Problems, Prev: Actual Bugs, Up: Trouble
|
||
|
||
Installation Problems
|
||
=====================
|
||
|
||
This is a list of problems (and some apparent problems which don't
|
||
really mean anything is wrong) that show up during installation of GNU
|
||
CC.
|
||
|
||
* On certain systems, defining certain environment variables such as
|
||
`CC' can interfere with the functioning of `make'.
|
||
|
||
* If you encounter seemingly strange errors when trying to build the
|
||
compiler in a directory other than the source directory, it could
|
||
be because you have previously configured the compiler in the
|
||
source directory. Make sure you have done all the necessary
|
||
preparations. *Note Other Dir::.
|
||
|
||
* If you build GCC on a BSD system using a directory stored in a
|
||
System V file system, problems may occur in running `fixincludes'
|
||
if the System V file system doesn't support symbolic links. These
|
||
problems result in a failure to fix the declaration of `size_t' in
|
||
`sys/types.h'. If you find that `size_t' is a signed type and
|
||
that type mismatches occur, this could be the cause.
|
||
|
||
The solution is not to use such a directory for building GCC.
|
||
|
||
* In previous versions of GCC, the `gcc' driver program looked for
|
||
`as' and `ld' in various places; for example, in files beginning
|
||
with `/usr/local/lib/gcc-'. GCC version 2 looks for them in the
|
||
directory `/usr/local/lib/gcc-lib/TARGET/VERSION'.
|
||
|
||
Thus, to use a version of `as' or `ld' that is not the system
|
||
default, for example `gas' or GNU `ld', you must put them in that
|
||
directory (or make links to them from that directory).
|
||
|
||
* Some commands executed when making the compiler may fail (return a
|
||
non-zero status) and be ignored by `make'. These failures, which
|
||
are often due to files that were not found, are expected, and can
|
||
safely be ignored.
|
||
|
||
* It is normal to have warnings in compiling certain files about
|
||
unreachable code and about enumeration type clashes. These files'
|
||
names begin with `insn-'. Also, `real.c' may get some warnings
|
||
that you can ignore.
|
||
|
||
* Sometimes `make' recompiles parts of the compiler when installing
|
||
the compiler. In one case, this was traced down to a bug in
|
||
`make'. Either ignore the problem or switch to GNU Make.
|
||
|
||
* If you have installed a program known as purify, you may find that
|
||
it causes errors while linking `enquire', which is part of building
|
||
GCC. The fix is to get rid of the file `real-ld' which purify
|
||
installs--so that GCC won't try to use it.
|
||
|
||
* On GNU/Linux SLS 1.01, there is a problem with `libc.a': it does
|
||
not contain the obstack functions. However, GCC assumes that the
|
||
obstack functions are in `libc.a' when it is the GNU C library.
|
||
To work around this problem, change the `__GNU_LIBRARY__'
|
||
conditional around line 31 to `#if 1'.
|
||
|
||
* On some 386 systems, building the compiler never finishes because
|
||
`enquire' hangs due to a hardware problem in the motherboard--it
|
||
reports floating point exceptions to the kernel incorrectly. You
|
||
can install GCC except for `float.h' by patching out the command to
|
||
run `enquire'. You may also be able to fix the problem for real by
|
||
getting a replacement motherboard. This problem was observed in
|
||
Revision E of the Micronics motherboard, and is fixed in Revision
|
||
F. It has also been observed in the MYLEX MXA-33 motherboard.
|
||
|
||
If you encounter this problem, you may also want to consider
|
||
removing the FPU from the socket during the compilation.
|
||
Alternatively, if you are running SCO Unix, you can reboot and
|
||
force the FPU to be ignored. To do this, type `hd(40)unix auto
|
||
ignorefpu'.
|
||
|
||
* On some 386 systems, GCC crashes trying to compile `enquire.c'.
|
||
This happens on machines that don't have a 387 FPU chip. On 386
|
||
machines, the system kernel is supposed to emulate the 387 when you
|
||
don't have one. The crash is due to a bug in the emulator.
|
||
|
||
One of these systems is the Unix from Interactive Systems: 386/ix.
|
||
On this system, an alternate emulator is provided, and it does
|
||
work. To use it, execute this command as super-user:
|
||
|
||
ln /etc/emulator.rel1 /etc/emulator
|
||
|
||
and then reboot the system. (The default emulator file remains
|
||
present under the name `emulator.dflt'.)
|
||
|
||
Try using `/etc/emulator.att', if you have such a problem on the
|
||
SCO system.
|
||
|
||
Another system which has this problem is Esix. We don't know
|
||
whether it has an alternate emulator that works.
|
||
|
||
On NetBSD 0.8, a similar problem manifests itself as these error
|
||
messages:
|
||
|
||
enquire.c: In function `fprop':
|
||
enquire.c:2328: floating overflow
|
||
|
||
* On SCO systems, when compiling GCC with the system's compiler, do
|
||
not use `-O'. Some versions of the system's compiler miscompile
|
||
GCC with `-O'.
|
||
|
||
* Sometimes on a Sun 4 you may observe a crash in the program
|
||
`genflags' or `genoutput' while building GCC. This is said to be
|
||
due to a bug in `sh'. You can probably get around it by running
|
||
`genflags' or `genoutput' manually and then retrying the `make'.
|
||
|
||
* On Solaris 2, executables of GCC version 2.0.2 are commonly
|
||
available, but they have a bug that shows up when compiling current
|
||
versions of GCC: undefined symbol errors occur during assembly if
|
||
you use `-g'.
|
||
|
||
The solution is to compile the current version of GCC without
|
||
`-g'. That makes a working compiler which you can use to recompile
|
||
with `-g'.
|
||
|
||
* Solaris 2 comes with a number of optional OS packages. Some of
|
||
these packages are needed to use GCC fully. If you did not
|
||
install all optional packages when installing Solaris, you will
|
||
need to verify that the packages that GCC needs are installed.
|
||
|
||
To check whether an optional package is installed, use the
|
||
`pkginfo' command. To add an optional package, use the `pkgadd'
|
||
command. For further details, see the Solaris documentation.
|
||
|
||
For Solaris 2.0 and 2.1, GCC needs six packages: `SUNWarc',
|
||
`SUNWbtool', `SUNWesu', `SUNWhea', `SUNWlibm', and `SUNWtoo'.
|
||
|
||
For Solaris 2.2, GCC needs an additional seventh package:
|
||
`SUNWsprot'.
|
||
|
||
* On Solaris 2, trying to use the linker and other tools in
|
||
`/usr/ucb' to install GCC has been observed to cause trouble. For
|
||
example, the linker may hang indefinitely. The fix is to remove
|
||
`/usr/ucb' from your `PATH'.
|
||
|
||
* If you use the 1.31 version of the MIPS assembler (such as was
|
||
shipped with Ultrix 3.1), you will need to use the
|
||
-fno-delayed-branch switch when optimizing floating point code.
|
||
Otherwise, the assembler will complain when the GCC compiler fills
|
||
a branch delay slot with a floating point instruction, such as
|
||
`add.d'.
|
||
|
||
* If on a MIPS system you get an error message saying "does not have
|
||
gp sections for all it's [sic] sectons [sic]", don't worry about
|
||
it. This happens whenever you use GAS with the MIPS linker, but
|
||
there is not really anything wrong, and it is okay to use the
|
||
output file. You can stop such warnings by installing the GNU
|
||
linker.
|
||
|
||
It would be nice to extend GAS to produce the gp tables, but they
|
||
are optional, and there should not be a warning about their
|
||
absence.
|
||
|
||
* In Ultrix 4.0 on the MIPS machine, `stdio.h' does not work with GNU
|
||
CC at all unless it has been fixed with `fixincludes'. This causes
|
||
problems in building GCC. Once GCC is installed, the problems go
|
||
away.
|
||
|
||
To work around this problem, when making the stage 1 compiler,
|
||
specify this option to Make:
|
||
|
||
GCC_FOR_TARGET="./xgcc -B./ -I./include"
|
||
|
||
When making stage 2 and stage 3, specify this option:
|
||
|
||
CFLAGS="-g -I./include"
|
||
|
||
* Users have reported some problems with version 2.0 of the MIPS
|
||
compiler tools that were shipped with Ultrix 4.1. Version 2.10
|
||
which came with Ultrix 4.2 seems to work fine.
|
||
|
||
Users have also reported some problems with version 2.20 of the
|
||
MIPS compiler tools that were shipped with RISC/os 4.x. The
|
||
earlier version 2.11 seems to work fine.
|
||
|
||
* Some versions of the MIPS linker will issue an assertion failure
|
||
when linking code that uses `alloca' against shared libraries on
|
||
RISC-OS 5.0, and DEC's OSF/1 systems. This is a bug in the
|
||
linker, that is supposed to be fixed in future revisions. To
|
||
protect against this, GCC passes `-non_shared' to the linker
|
||
unless you pass an explicit `-shared' or `-call_shared' switch.
|
||
|
||
* On System V release 3, you may get this error message while
|
||
linking:
|
||
|
||
ld fatal: failed to write symbol name SOMETHING
|
||
in strings table for file WHATEVER
|
||
|
||
This probably indicates that the disk is full or your ULIMIT won't
|
||
allow the file to be as large as it needs to be.
|
||
|
||
This problem can also result because the kernel parameter `MAXUMEM'
|
||
is too small. If so, you must regenerate the kernel and make the
|
||
value much larger. The default value is reported to be 1024; a
|
||
value of 32768 is said to work. Smaller values may also work.
|
||
|
||
* On System V, if you get an error like this,
|
||
|
||
/usr/local/lib/bison.simple: In function `yyparse':
|
||
/usr/local/lib/bison.simple:625: virtual memory exhausted
|
||
|
||
that too indicates a problem with disk space, ULIMIT, or `MAXUMEM'.
|
||
|
||
* Current GCC versions probably do not work on version 2 of the NeXT
|
||
operating system.
|
||
|
||
* On NeXTStep 3.0, the Objective C compiler does not work, due,
|
||
apparently, to a kernel bug that it happens to trigger. This
|
||
problem does not happen on 3.1.
|
||
|
||
* On the Tower models 4N0 and 6N0, by default a process is not
|
||
allowed to have more than one megabyte of memory. GCC cannot
|
||
compile itself (or many other programs) with `-O' in that much
|
||
memory.
|
||
|
||
To solve this problem, reconfigure the kernel adding the following
|
||
line to the configuration file:
|
||
|
||
MAXUMEM = 4096
|
||
|
||
* On HP 9000 series 300 or 400 running HP-UX release 8.0, there is a
|
||
bug in the assembler that must be fixed before GCC can be built.
|
||
This bug manifests itself during the first stage of compilation,
|
||
while building `libgcc2.a':
|
||
|
||
_floatdisf
|
||
cc1: warning: `-g' option not supported on this version of GCC
|
||
cc1: warning: `-g1' option not supported on this version of GCC
|
||
./xgcc: Internal compiler error: program as got fatal signal 11
|
||
|
||
A patched version of the assembler is available by anonymous ftp
|
||
from `altdorf.ai.mit.edu' as the file
|
||
`archive/cph/hpux-8.0-assembler'. If you have HP software support,
|
||
the patch can also be obtained directly from HP, as described in
|
||
the following note:
|
||
|
||
This is the patched assembler, to patch SR#1653-010439, where
|
||
the assembler aborts on floating point constants.
|
||
|
||
The bug is not really in the assembler, but in the shared
|
||
library version of the function "cvtnum(3c)". The bug on
|
||
"cvtnum(3c)" is SR#4701-078451. Anyway, the attached
|
||
assembler uses the archive library version of "cvtnum(3c)"
|
||
and thus does not exhibit the bug.
|
||
|
||
This patch is also known as PHCO_4484.
|
||
|
||
* On HP-UX version 8.05, but not on 8.07 or more recent versions,
|
||
the `fixproto' shell script triggers a bug in the system shell.
|
||
If you encounter this problem, upgrade your operating system or
|
||
use BASH (the GNU shell) to run `fixproto'.
|
||
|
||
* Some versions of the Pyramid C compiler are reported to be unable
|
||
to compile GCC. You must use an older version of GCC for
|
||
bootstrapping. One indication of this problem is if you get a
|
||
crash when GCC compiles the function `muldi3' in file `libgcc2.c'.
|
||
|
||
You may be able to succeed by getting GCC version 1, installing it,
|
||
and using it to compile GCC version 2. The bug in the Pyramid C
|
||
compiler does not seem to affect GCC version 1.
|
||
|
||
* There may be similar problems on System V Release 3.1 on 386
|
||
systems.
|
||
|
||
* On the Intel Paragon (an i860 machine), if you are using operating
|
||
system version 1.0, you will get warnings or errors about
|
||
redefinition of `va_arg' when you build GCC.
|
||
|
||
If this happens, then you need to link most programs with the
|
||
library `iclib.a'. You must also modify `stdio.h' as follows:
|
||
before the lines
|
||
|
||
#if defined(__i860__) && !defined(_VA_LIST)
|
||
#include <va_list.h>
|
||
|
||
insert the line
|
||
|
||
#if __PGC__
|
||
|
||
and after the lines
|
||
|
||
extern int vprintf(const char *, va_list );
|
||
extern int vsprintf(char *, const char *, va_list );
|
||
#endif
|
||
|
||
insert the line
|
||
|
||
#endif /* __PGC__ */
|
||
|
||
These problems don't exist in operating system version 1.1.
|
||
|
||
* On the Altos 3068, programs compiled with GCC won't work unless you
|
||
fix a kernel bug. This happens using system versions V.2.2 1.0gT1
|
||
and V.2.2 1.0e and perhaps later versions as well. See the file
|
||
`README.ALTOS'.
|
||
|
||
* You will get several sorts of compilation and linking errors on the
|
||
we32k if you don't follow the special instructions. *Note
|
||
Configurations::.
|
||
|
||
* A bug in the HP-UX 8.05 (and earlier) shell will cause the fixproto
|
||
program to report an error of the form:
|
||
|
||
./fixproto: sh internal 1K buffer overflow
|
||
|
||
To fix this, change the first line of the fixproto script to look
|
||
like:
|
||
|
||
#!/bin/ksh
|
||
|
||
|
||
File: gcc.info, Node: Cross-Compiler Problems, Next: Interoperation, Prev: Installation Problems, Up: Trouble
|
||
|
||
Cross-Compiler Problems
|
||
=======================
|
||
|
||
You may run into problems with cross compilation on certain machines,
|
||
for several reasons.
|
||
|
||
* Cross compilation can run into trouble for certain machines because
|
||
some target machines' assemblers require floating point numbers to
|
||
be written as *integer* constants in certain contexts.
|
||
|
||
The compiler writes these integer constants by examining the
|
||
floating point value as an integer and printing that integer,
|
||
because this is simple to write and independent of the details of
|
||
the floating point representation. But this does not work if the
|
||
compiler is running on a different machine with an incompatible
|
||
floating point format, or even a different byte-ordering.
|
||
|
||
In addition, correct constant folding of floating point values
|
||
requires representing them in the target machine's format. (The C
|
||
standard does not quite require this, but in practice it is the
|
||
only way to win.)
|
||
|
||
It is now possible to overcome these problems by defining macros
|
||
such as `REAL_VALUE_TYPE'. But doing so is a substantial amount of
|
||
work for each target machine. *Note Cross-compilation::.
|
||
|
||
* At present, the program `mips-tfile' which adds debug support to
|
||
object files on MIPS systems does not work in a cross compile
|
||
environment.
|
||
|
||
|
||
File: gcc.info, Node: Interoperation, Next: External Bugs, Prev: Cross-Compiler Problems, Up: Trouble
|
||
|
||
Interoperation
|
||
==============
|
||
|
||
This section lists various difficulties encountered in using GNU C or
|
||
GNU C++ together with other compilers or with the assemblers, linkers,
|
||
libraries and debuggers on certain systems.
|
||
|
||
* Objective C does not work on the RS/6000.
|
||
|
||
* GNU C++ does not do name mangling in the same way as other C++
|
||
compilers. This means that object files compiled with one compiler
|
||
cannot be used with another.
|
||
|
||
This effect is intentional, to protect you from more subtle
|
||
problems. Compilers differ as to many internal details of C++
|
||
implementation, including: how class instances are laid out, how
|
||
multiple inheritance is implemented, and how virtual function
|
||
calls are handled. If the name encoding were made the same, your
|
||
programs would link against libraries provided from other
|
||
compilers--but the programs would then crash when run.
|
||
Incompatible libraries are then detected at link time, rather than
|
||
at run time.
|
||
|
||
* Older GDB versions sometimes fail to read the output of GCC version
|
||
2. If you have trouble, get GDB version 4.4 or later.
|
||
|
||
* DBX rejects some files produced by GCC, though it accepts similar
|
||
constructs in output from PCC. Until someone can supply a coherent
|
||
description of what is valid DBX input and what is not, there is
|
||
nothing I can do about these problems. You are on your own.
|
||
|
||
* The GNU assembler (GAS) does not support PIC. To generate PIC
|
||
code, you must use some other assembler, such as `/bin/as'.
|
||
|
||
* On some BSD systems, including some versions of Ultrix, use of
|
||
profiling causes static variable destructors (currently used only
|
||
in C++) not to be run.
|
||
|
||
* Use of `-I/usr/include' may cause trouble.
|
||
|
||
Many systems come with header files that won't work with GCC unless
|
||
corrected by `fixincludes'. The corrected header files go in a new
|
||
directory; GCC searches this directory before `/usr/include'. If
|
||
you use `-I/usr/include', this tells GCC to search `/usr/include'
|
||
earlier on, before the corrected headers. The result is that you
|
||
get the uncorrected header files.
|
||
|
||
Instead, you should use these options (when compiling C programs):
|
||
|
||
-I/usr/local/lib/gcc-lib/TARGET/VERSION/include -I/usr/include
|
||
|
||
For C++ programs, GCC also uses a special directory that defines
|
||
C++ interfaces to standard C subroutines. This directory is meant
|
||
to be searched *before* other standard include directories, so
|
||
that it takes precedence. If you are compiling C++ programs and
|
||
specifying include directories explicitly, use this option first,
|
||
then the two options above:
|
||
|
||
-I/usr/local/lib/g++-include
|
||
|
||
* On some SGI systems, when you use `-lgl_s' as an option, it gets
|
||
translated magically to `-lgl_s -lX11_s -lc_s'. Naturally, this
|
||
does not happen when you use GCC. You must specify all three
|
||
options explicitly.
|
||
|
||
* On a Sparc, GCC aligns all values of type `double' on an 8-byte
|
||
boundary, and it expects every `double' to be so aligned. The Sun
|
||
compiler usually gives `double' values 8-byte alignment, with one
|
||
exception: function arguments of type `double' may not be aligned.
|
||
|
||
As a result, if a function compiled with Sun CC takes the address
|
||
of an argument of type `double' and passes this pointer of type
|
||
`double *' to a function compiled with GCC, dereferencing the
|
||
pointer may cause a fatal signal.
|
||
|
||
One way to solve this problem is to compile your entire program
|
||
with GNU CC. Another solution is to modify the function that is
|
||
compiled with Sun CC to copy the argument into a local variable;
|
||
local variables are always properly aligned. A third solution is
|
||
to modify the function that uses the pointer to dereference it via
|
||
the following function `access_double' instead of directly with
|
||
`*':
|
||
|
||
inline double
|
||
access_double (double *unaligned_ptr)
|
||
{
|
||
union d2i { double d; int i[2]; };
|
||
|
||
union d2i *p = (union d2i *) unaligned_ptr;
|
||
union d2i u;
|
||
|
||
u.i[0] = p->i[0];
|
||
u.i[1] = p->i[1];
|
||
|
||
return u.d;
|
||
}
|
||
|
||
Storing into the pointer can be done likewise with the same union.
|
||
|
||
* On Solaris, the `malloc' function in the `libmalloc.a' library may
|
||
allocate memory that is only 4 byte aligned. Since GCC on the
|
||
Sparc assumes that doubles are 8 byte aligned, this may result in a
|
||
fatal signal if doubles are stored in memory allocated by the
|
||
`libmalloc.a' library.
|
||
|
||
The solution is to not use the `libmalloc.a' library. Use instead
|
||
`malloc' and related functions from `libc.a'; they do not have
|
||
this problem.
|
||
|
||
* Sun forgot to include a static version of `libdl.a' with some
|
||
versions of SunOS (mainly 4.1). This results in undefined symbols
|
||
when linking static binaries (that is, if you use `-static'). If
|
||
you see undefined symbols `_dlclose', `_dlsym' or `_dlopen' when
|
||
linking, compile and link against the file `mit/util/misc/dlsym.c'
|
||
from the MIT version of X windows.
|
||
|
||
* The 128-bit long double format that the Sparc port supports
|
||
currently works by using the architecturally defined quad-word
|
||
floating point instructions. Since there is no hardware that
|
||
supports these instructions they must be emulated by the operating
|
||
system. Long doubles do not work in Sun OS versions 4.0.3 and
|
||
earlier, because the kernel emulator uses an obsolete and
|
||
incompatible format. Long doubles do not work in Sun OS version
|
||
4.1.1 due to a problem in a Sun library. Long doubles do work on
|
||
Sun OS versions 4.1.2 and higher, but GCC does not enable them by
|
||
default. Long doubles appear to work in Sun OS 5.x (Solaris 2.x).
|
||
|
||
* On HP-UX version 9.01 on the HP PA, the HP compiler `cc' does not
|
||
compile GCC correctly. We do not yet know why. However, GCC
|
||
compiled on earlier HP-UX versions works properly on HP-UX 9.01
|
||
and can compile itself properly on 9.01.
|
||
|
||
* On the HP PA machine, ADB sometimes fails to work on functions
|
||
compiled with GCC. Specifically, it fails to work on functions
|
||
that use `alloca' or variable-size arrays. This is because GCC
|
||
doesn't generate HP-UX unwind descriptors for such functions. It
|
||
may even be impossible to generate them.
|
||
|
||
* Debugging (`-g') is not supported on the HP PA machine, unless you
|
||
use the preliminary GNU tools (*note Installation::.).
|
||
|
||
* Taking the address of a label may generate errors from the HP-UX
|
||
PA assembler. GAS for the PA does not have this problem.
|
||
|
||
* Using floating point parameters for indirect calls to static
|
||
functions will not work when using the HP assembler. There simply
|
||
is no way for GCC to specify what registers hold arguments for
|
||
static functions when using the HP assembler. GAS for the PA does
|
||
not have this problem.
|
||
|
||
* In extremely rare cases involving some very large functions you may
|
||
receive errors from the HP linker complaining about an out of
|
||
bounds unconditional branch offset. This used to occur more often
|
||
in previous versions of GCC, but is now exceptionally rare. If
|
||
you should run into it, you can work around by making your
|
||
function smaller.
|
||
|
||
* GCC compiled code sometimes emits warnings from the HP-UX
|
||
assembler of the form:
|
||
|
||
(warning) Use of GR3 when
|
||
frame >= 8192 may cause conflict.
|
||
|
||
These warnings are harmless and can be safely ignored.
|
||
|
||
* The current version of the assembler (`/bin/as') for the RS/6000
|
||
has certain problems that prevent the `-g' option in GCC from
|
||
working. Note that `Makefile.in' uses `-g' by default when
|
||
compiling `libgcc2.c'.
|
||
|
||
IBM has produced a fixed version of the assembler. The upgraded
|
||
assembler unfortunately was not included in any of the AIX 3.2
|
||
update PTF releases (3.2.2, 3.2.3, or 3.2.3e). Users of AIX 3.1
|
||
should request PTF U403044 from IBM and users of AIX 3.2 should
|
||
request PTF U416277. See the file `README.RS6000' for more
|
||
details on these updates.
|
||
|
||
You can test for the presense of a fixed assembler by using the
|
||
command
|
||
|
||
as -u < /dev/null
|
||
|
||
If the command exits normally, the assembler fix already is
|
||
installed. If the assembler complains that "-u" is an unknown
|
||
flag, you need to order the fix.
|
||
|
||
* On the IBM RS/6000, compiling code of the form
|
||
|
||
extern int foo;
|
||
|
||
... foo ...
|
||
|
||
static int foo;
|
||
|
||
will cause the linker to report an undefined symbol `foo'.
|
||
Although this behavior differs from most other systems, it is not a
|
||
bug because redefining an `extern' variable as `static' is
|
||
undefined in ANSI C.
|
||
|
||
* AIX on the RS/6000 provides support (NLS) for environments outside
|
||
of the United States. Compilers and assemblers use NLS to support
|
||
locale-specific representations of various objects including
|
||
floating-point numbers ("." vs "," for separating decimal
|
||
fractions). There have been problems reported where the library
|
||
linked with GCC does not produce the same floating-point formats
|
||
that the assembler accepts. If you have this problem, set the
|
||
LANG environment variable to "C" or "En_US".
|
||
|
||
* Even if you specify `-fdollars-in-identifiers', you cannot
|
||
successfully use `$' in identifiers on the RS/6000 due to a
|
||
restriction in the IBM assembler. GAS supports these identifiers.
|
||
|
||
* On the RS/6000, XLC version 1.3.0.0 will miscompile `jump.c'. XLC
|
||
version 1.3.0.1 or later fixes this problem. You can obtain
|
||
XLC-1.3.0.2 by requesting PTF 421749 from IBM.
|
||
|
||
* There is an assembler bug in versions of DG/UX prior to 5.4.2.01
|
||
that occurs when the `fldcr' instruction is used. GCC uses
|
||
`fldcr' on the 88100 to serialize volatile memory references. Use
|
||
the option `-mno-serialize-volatile' if your version of the
|
||
assembler has this bug.
|
||
|
||
* On VMS, GAS versions 1.38.1 and earlier may cause spurious warning
|
||
messages from the linker. These warning messages complain of
|
||
mismatched psect attributes. You can ignore them. *Note VMS
|
||
Install::.
|
||
|
||
* On NewsOS version 3, if you include both of the files `stddef.h'
|
||
and `sys/types.h', you get an error because there are two typedefs
|
||
of `size_t'. You should change `sys/types.h' by adding these
|
||
lines around the definition of `size_t':
|
||
|
||
#ifndef _SIZE_T
|
||
#define _SIZE_T
|
||
ACTUAL TYPEDEF HERE
|
||
#endif
|
||
|
||
* On the Alliant, the system's own convention for returning
|
||
structures and unions is unusual, and is not compatible with GCC
|
||
no matter what options are used.
|
||
|
||
* On the IBM RT PC, the MetaWare HighC compiler (hc) uses a different
|
||
convention for structure and union returning. Use the option
|
||
`-mhc-struct-return' to tell GCC to use a convention compatible
|
||
with it.
|
||
|
||
* On Ultrix, the Fortran compiler expects registers 2 through 5 to
|
||
be saved by function calls. However, the C compiler uses
|
||
conventions compatible with BSD Unix: registers 2 through 5 may be
|
||
clobbered by function calls.
|
||
|
||
GCC uses the same convention as the Ultrix C compiler. You can use
|
||
these options to produce code compatible with the Fortran compiler:
|
||
|
||
-fcall-saved-r2 -fcall-saved-r3 -fcall-saved-r4 -fcall-saved-r5
|
||
|
||
* On the WE32k, you may find that programs compiled with GCC do not
|
||
work with the standard shared C library. You may need to link with
|
||
the ordinary C compiler. If you do so, you must specify the
|
||
following options:
|
||
|
||
-L/usr/local/lib/gcc-lib/we32k-att-sysv/2.8.1 -lgcc -lc_s
|
||
|
||
The first specifies where to find the library `libgcc.a' specified
|
||
with the `-lgcc' option.
|
||
|
||
GCC does linking by invoking `ld', just as `cc' does, and there is
|
||
no reason why it *should* matter which compilation program you use
|
||
to invoke `ld'. If someone tracks this problem down, it can
|
||
probably be fixed easily.
|
||
|
||
* On the Alpha, you may get assembler errors about invalid syntax as
|
||
a result of floating point constants. This is due to a bug in the
|
||
C library functions `ecvt', `fcvt' and `gcvt'. Given valid
|
||
floating point numbers, they sometimes print `NaN'.
|
||
|
||
* On Irix 4.0.5F (and perhaps in some other versions), an assembler
|
||
bug sometimes reorders instructions incorrectly when optimization
|
||
is turned on. If you think this may be happening to you, try
|
||
using the GNU assembler; GAS version 2.1 supports ECOFF on Irix.
|
||
|
||
Or use the `-noasmopt' option when you compile GCC with itself,
|
||
and then again when you compile your program. (This is a temporary
|
||
kludge to turn off assembler optimization on Irix.) If this
|
||
proves to be what you need, edit the assembler spec in the file
|
||
`specs' so that it unconditionally passes `-O0' to the assembler,
|
||
and never passes `-O2' or `-O3'.
|
||
|
||
|
||
File: gcc.info, Node: External Bugs, Next: Incompatibilities, Prev: Interoperation, Up: Trouble
|
||
|
||
Problems Compiling Certain Programs
|
||
===================================
|
||
|
||
Certain programs have problems compiling.
|
||
|
||
* Parse errors may occur compiling X11 on a Decstation running
|
||
Ultrix 4.2 because of problems in DEC's versions of the X11 header
|
||
files `X11/Xlib.h' and `X11/Xutil.h'. People recommend adding
|
||
`-I/usr/include/mit' to use the MIT versions of the header files,
|
||
using the `-traditional' switch to turn off ANSI C, or fixing the
|
||
header files by adding this:
|
||
|
||
#ifdef __STDC__
|
||
#define NeedFunctionPrototypes 0
|
||
#endif
|
||
|
||
* If you have trouble compiling Perl on a SunOS 4 system, it may be
|
||
because Perl specifies `-I/usr/ucbinclude'. This accesses the
|
||
unfixed header files. Perl specifies the options
|
||
|
||
-traditional -Dvolatile=__volatile__
|
||
-I/usr/include/sun -I/usr/ucbinclude
|
||
-fpcc-struct-return
|
||
|
||
most of which are unnecessary with GCC 2.4.5 and newer versions.
|
||
You can make a properly working Perl by setting `ccflags' to
|
||
`-fwritable-strings' (implied by the `-traditional' in the
|
||
original options) and `cppflags' to empty in `config.sh', then
|
||
typing `./doSH; make depend; make'.
|
||
|
||
* On various 386 Unix systems derived from System V, including SCO,
|
||
ISC, and ESIX, you may get error messages about running out of
|
||
virtual memory while compiling certain programs.
|
||
|
||
You can prevent this problem by linking GCC with the GNU malloc
|
||
(which thus replaces the malloc that comes with the system). GNU
|
||
malloc is available as a separate package, and also in the file
|
||
`src/gmalloc.c' in the GNU Emacs 19 distribution.
|
||
|
||
If you have installed GNU malloc as a separate library package,
|
||
use this option when you relink GCC:
|
||
|
||
MALLOC=/usr/local/lib/libgmalloc.a
|
||
|
||
Alternatively, if you have compiled `gmalloc.c' from Emacs 19, copy
|
||
the object file to `gmalloc.o' and use this option when you relink
|
||
GCC:
|
||
|
||
MALLOC=gmalloc.o
|
||
|
||
|
||
File: gcc.info, Node: Incompatibilities, Next: Fixed Headers, Prev: External Bugs, Up: Trouble
|
||
|
||
Incompatibilities of GCC
|
||
========================
|
||
|
||
There are several noteworthy incompatibilities between GNU C and most
|
||
existing (non-ANSI) versions of C. The `-traditional' option
|
||
eliminates many of these incompatibilities, *but not all*, by telling
|
||
GNU C to behave like the other C compilers.
|
||
|
||
* GCC normally makes string constants read-only. If several
|
||
identical-looking string constants are used, GCC stores only one
|
||
copy of the string.
|
||
|
||
One consequence is that you cannot call `mktemp' with a string
|
||
constant argument. The function `mktemp' always alters the string
|
||
its argument points to.
|
||
|
||
Another consequence is that `sscanf' does not work on some systems
|
||
when passed a string constant as its format control string or
|
||
input. This is because `sscanf' incorrectly tries to write into
|
||
the string constant. Likewise `fscanf' and `scanf'.
|
||
|
||
The best solution to these problems is to change the program to use
|
||
`char'-array variables with initialization strings for these
|
||
purposes instead of string constants. But if this is not possible,
|
||
you can use the `-fwritable-strings' flag, which directs GCC to
|
||
handle string constants the same way most C compilers do.
|
||
`-traditional' also has this effect, among others.
|
||
|
||
* `-2147483648' is positive.
|
||
|
||
This is because 2147483648 cannot fit in the type `int', so
|
||
(following the ANSI C rules) its data type is `unsigned long int'.
|
||
Negating this value yields 2147483648 again.
|
||
|
||
* GCC does not substitute macro arguments when they appear inside of
|
||
string constants. For example, the following macro in GCC
|
||
|
||
#define foo(a) "a"
|
||
|
||
will produce output `"a"' regardless of what the argument A is.
|
||
|
||
The `-traditional' option directs GCC to handle such cases (among
|
||
others) in the old-fashioned (non-ANSI) fashion.
|
||
|
||
* When you use `setjmp' and `longjmp', the only automatic variables
|
||
guaranteed to remain valid are those declared `volatile'. This is
|
||
a consequence of automatic register allocation. Consider this
|
||
function:
|
||
|
||
jmp_buf j;
|
||
|
||
foo ()
|
||
{
|
||
int a, b;
|
||
|
||
a = fun1 ();
|
||
if (setjmp (j))
|
||
return a;
|
||
|
||
a = fun2 ();
|
||
/* `longjmp (j)' may occur in `fun3'. */
|
||
return a + fun3 ();
|
||
}
|
||
|
||
Here `a' may or may not be restored to its first value when the
|
||
`longjmp' occurs. If `a' is allocated in a register, then its
|
||
first value is restored; otherwise, it keeps the last value stored
|
||
in it.
|
||
|
||
If you use the `-W' option with the `-O' option, you will get a
|
||
warning when GCC thinks such a problem might be possible.
|
||
|
||
The `-traditional' option directs GNU C to put variables in the
|
||
stack by default, rather than in registers, in functions that call
|
||
`setjmp'. This results in the behavior found in traditional C
|
||
compilers.
|
||
|
||
* Programs that use preprocessing directives in the middle of macro
|
||
arguments do not work with GCC. For example, a program like this
|
||
will not work:
|
||
|
||
foobar (
|
||
#define luser
|
||
hack)
|
||
|
||
ANSI C does not permit such a construct. It would make sense to
|
||
support it when `-traditional' is used, but it is too much work to
|
||
implement.
|
||
|
||
* Declarations of external variables and functions within a block
|
||
apply only to the block containing the declaration. In other
|
||
words, they have the same scope as any other declaration in the
|
||
same place.
|
||
|
||
In some other C compilers, a `extern' declaration affects all the
|
||
rest of the file even if it happens within a block.
|
||
|
||
The `-traditional' option directs GNU C to treat all `extern'
|
||
declarations as global, like traditional compilers.
|
||
|
||
* In traditional C, you can combine `long', etc., with a typedef
|
||
name, as shown here:
|
||
|
||
typedef int foo;
|
||
typedef long foo bar;
|
||
|
||
In ANSI C, this is not allowed: `long' and other type modifiers
|
||
require an explicit `int'. Because this criterion is expressed by
|
||
Bison grammar rules rather than C code, the `-traditional' flag
|
||
cannot alter it.
|
||
|
||
* PCC allows typedef names to be used as function parameters. The
|
||
difficulty described immediately above applies here too.
|
||
|
||
* PCC allows whitespace in the middle of compound assignment
|
||
operators such as `+='. GCC, following the ANSI standard, does not
|
||
allow this. The difficulty described immediately above applies
|
||
here too.
|
||
|
||
* GCC complains about unterminated character constants inside of
|
||
preprocessing conditionals that fail. Some programs have English
|
||
comments enclosed in conditionals that are guaranteed to fail; if
|
||
these comments contain apostrophes, GCC will probably report an
|
||
error. For example, this code would produce an error:
|
||
|
||
#if 0
|
||
You can't expect this to work.
|
||
#endif
|
||
|
||
The best solution to such a problem is to put the text into an
|
||
actual C comment delimited by `/*...*/'. However, `-traditional'
|
||
suppresses these error messages.
|
||
|
||
* Many user programs contain the declaration `long time ();'. In the
|
||
past, the system header files on many systems did not actually
|
||
declare `time', so it did not matter what type your program
|
||
declared it to return. But in systems with ANSI C headers, `time'
|
||
is declared to return `time_t', and if that is not the same as
|
||
`long', then `long time ();' is erroneous.
|
||
|
||
The solution is to change your program to use `time_t' as the
|
||
return type of `time'.
|
||
|
||
* When compiling functions that return `float', PCC converts it to a
|
||
double. GCC actually returns a `float'. If you are concerned
|
||
with PCC compatibility, you should declare your functions to return
|
||
`double'; you might as well say what you mean.
|
||
|
||
* When compiling functions that return structures or unions, GCC
|
||
output code normally uses a method different from that used on most
|
||
versions of Unix. As a result, code compiled with GCC cannot call
|
||
a structure-returning function compiled with PCC, and vice versa.
|
||
|
||
The method used by GCC is as follows: a structure or union which is
|
||
1, 2, 4 or 8 bytes long is returned like a scalar. A structure or
|
||
union with any other size is stored into an address supplied by
|
||
the caller (usually in a special, fixed register, but on some
|
||
machines it is passed on the stack). The machine-description
|
||
macros `STRUCT_VALUE' and `STRUCT_INCOMING_VALUE' tell GCC where
|
||
to pass this address.
|
||
|
||
By contrast, PCC on most target machines returns structures and
|
||
unions of any size by copying the data into an area of static
|
||
storage, and then returning the address of that storage as if it
|
||
were a pointer value. The caller must copy the data from that
|
||
memory area to the place where the value is wanted. GCC does not
|
||
use this method because it is slower and nonreentrant.
|
||
|
||
On some newer machines, PCC uses a reentrant convention for all
|
||
structure and union returning. GCC on most of these machines uses
|
||
a compatible convention when returning structures and unions in
|
||
memory, but still returns small structures and unions in registers.
|
||
|
||
You can tell GCC to use a compatible convention for all structure
|
||
and union returning with the option `-fpcc-struct-return'.
|
||
|
||
* GNU C complains about program fragments such as `0x74ae-0x4000'
|
||
which appear to be two hexadecimal constants separated by the minus
|
||
operator. Actually, this string is a single "preprocessing token".
|
||
Each such token must correspond to one token in C. Since this
|
||
does not, GNU C prints an error message. Although it may appear
|
||
obvious that what is meant is an operator and two values, the ANSI
|
||
C standard specifically requires that this be treated as erroneous.
|
||
|
||
A "preprocessing token" is a "preprocessing number" if it begins
|
||
with a digit and is followed by letters, underscores, digits,
|
||
periods and `e+', `e-', `E+', or `E-' character sequences.
|
||
|
||
To make the above program fragment valid, place whitespace in
|
||
front of the minus sign. This whitespace will end the
|
||
preprocessing number.
|
||
|
||
|
||
File: gcc.info, Node: Fixed Headers, Next: Standard Libraries, Prev: Incompatibilities, Up: Trouble
|
||
|
||
Fixed Header Files
|
||
==================
|
||
|
||
GCC needs to install corrected versions of some system header files.
|
||
This is because most target systems have some header files that won't
|
||
work with GCC unless they are changed. Some have bugs, some are
|
||
incompatible with ANSI C, and some depend on special features of other
|
||
compilers.
|
||
|
||
Installing GCC automatically creates and installs the fixed header
|
||
files, by running a program called `fixincludes' (or for certain
|
||
targets an alternative such as `fixinc.svr4'). Normally, you don't
|
||
need to pay attention to this. But there are cases where it doesn't do
|
||
the right thing automatically.
|
||
|
||
* If you update the system's header files, such as by installing a
|
||
new system version, the fixed header files of GCC are not
|
||
automatically updated. The easiest way to update them is to
|
||
reinstall GCC. (If you want to be clever, look in the makefile
|
||
and you can find a shortcut.)
|
||
|
||
* On some systems, in particular SunOS 4, header file directories
|
||
contain machine-specific symbolic links in certain places. This
|
||
makes it possible to share most of the header files among hosts
|
||
running the same version of SunOS 4 on different machine models.
|
||
|
||
The programs that fix the header files do not understand this
|
||
special way of using symbolic links; therefore, the directory of
|
||
fixed header files is good only for the machine model used to
|
||
build it.
|
||
|
||
In SunOS 4, only programs that look inside the kernel will notice
|
||
the difference between machine models. Therefore, for most
|
||
purposes, you need not be concerned about this.
|
||
|
||
It is possible to make separate sets of fixed header files for the
|
||
different machine models, and arrange a structure of symbolic
|
||
links so as to use the proper set, but you'll have to do this by
|
||
hand.
|
||
|
||
* On Lynxos, GCC by default does not fix the header files. This is
|
||
because bugs in the shell cause the `fixincludes' script to fail.
|
||
|
||
This means you will encounter problems due to bugs in the system
|
||
header files. It may be no comfort that they aren't GCC's fault,
|
||
but it does mean that there's nothing for us to do about them.
|
||
|
||
|
||
File: gcc.info, Node: Standard Libraries, Next: Disappointments, Prev: Fixed Headers, Up: Trouble
|
||
|
||
Standard Libraries
|
||
==================
|
||
|
||
GCC by itself attempts to be what the ISO/ANSI C standard calls a
|
||
"conforming freestanding implementation". This means all ANSI C
|
||
language features are available, as well as the contents of `float.h',
|
||
`limits.h', `stdarg.h', and `stddef.h'. The rest of the C library is
|
||
supplied by the vendor of the operating system. If that C library
|
||
doesn't conform to the C standards, then your programs might get
|
||
warnings (especially when using `-Wall') that you don't expect.
|
||
|
||
For example, the `sprintf' function on SunOS 4.1.3 returns `char *'
|
||
while the C standard says that `sprintf' returns an `int'. The
|
||
`fixincludes' program could make the prototype for this function match
|
||
the Standard, but that would be wrong, since the function will still
|
||
return `char *'.
|
||
|
||
If you need a Standard compliant library, then you need to find one,
|
||
as GCC does not provide one. The GNU C library (called `glibc') has
|
||
been ported to a number of operating systems, and provides ANSI/ISO,
|
||
POSIX, BSD and SystemV compatibility. You could also ask your operating
|
||
system vendor if newer libraries are available.
|
||
|
||
|
||
File: gcc.info, Node: Disappointments, Next: C++ Misunderstandings, Prev: Standard Libraries, Up: Trouble
|
||
|
||
Disappointments and Misunderstandings
|
||
=====================================
|
||
|
||
These problems are perhaps regrettable, but we don't know any
|
||
practical way around them.
|
||
|
||
* Certain local variables aren't recognized by debuggers when you
|
||
compile with optimization.
|
||
|
||
This occurs because sometimes GCC optimizes the variable out of
|
||
existence. There is no way to tell the debugger how to compute the
|
||
value such a variable "would have had", and it is not clear that
|
||
would be desirable anyway. So GCC simply does not mention the
|
||
eliminated variable when it writes debugging information.
|
||
|
||
You have to expect a certain amount of disagreement between the
|
||
executable and your source code, when you use optimization.
|
||
|
||
* Users often think it is a bug when GCC reports an error for code
|
||
like this:
|
||
|
||
int foo (struct mumble *);
|
||
|
||
struct mumble { ... };
|
||
|
||
int foo (struct mumble *x)
|
||
{ ... }
|
||
|
||
This code really is erroneous, because the scope of `struct
|
||
mumble' in the prototype is limited to the argument list
|
||
containing it. It does not refer to the `struct mumble' defined
|
||
with file scope immediately below--they are two unrelated types
|
||
with similar names in different scopes.
|
||
|
||
But in the definition of `foo', the file-scope type is used
|
||
because that is available to be inherited. Thus, the definition
|
||
and the prototype do not match, and you get an error.
|
||
|
||
This behavior may seem silly, but it's what the ANSI standard
|
||
specifies. It is easy enough for you to make your code work by
|
||
moving the definition of `struct mumble' above the prototype.
|
||
It's not worth being incompatible with ANSI C just to avoid an
|
||
error for the example shown above.
|
||
|
||
* Accesses to bitfields even in volatile objects works by accessing
|
||
larger objects, such as a byte or a word. You cannot rely on what
|
||
size of object is accessed in order to read or write the bitfield;
|
||
it may even vary for a given bitfield according to the precise
|
||
usage.
|
||
|
||
If you care about controlling the amount of memory that is
|
||
accessed, use volatile but do not use bitfields.
|
||
|
||
* GCC comes with shell scripts to fix certain known problems in
|
||
system header files. They install corrected copies of various
|
||
header files in a special directory where only GCC will normally
|
||
look for them. The scripts adapt to various systems by searching
|
||
all the system header files for the problem cases that we know
|
||
about.
|
||
|
||
If new system header files are installed, nothing automatically
|
||
arranges to update the corrected header files. You will have to
|
||
reinstall GCC to fix the new header files. More specifically, go
|
||
to the build directory and delete the files `stmp-fixinc' and
|
||
`stmp-headers', and the subdirectory `include'; then do `make
|
||
install' again.
|
||
|
||
* On 68000 and x86 systems, for instance, you can get paradoxical
|
||
results if you test the precise values of floating point numbers.
|
||
For example, you can find that a floating point value which is not
|
||
a NaN is not equal to itself. This results from the fact that the
|
||
floating point registers hold a few more bits of precision than
|
||
fit in a `double' in memory. Compiled code moves values between
|
||
memory and floating point registers at its convenience, and moving
|
||
them into memory truncates them.
|
||
|
||
You can partially avoid this problem by using the `-ffloat-store'
|
||
option (*note Optimize Options::.).
|
||
|
||
* On the MIPS, variable argument functions using `varargs.h' cannot
|
||
have a floating point value for the first argument. The reason
|
||
for this is that in the absence of a prototype in scope, if the
|
||
first argument is a floating point, it is passed in a floating
|
||
point register, rather than an integer register.
|
||
|
||
If the code is rewritten to use the ANSI standard `stdarg.h'
|
||
method of variable arguments, and the prototype is in scope at the
|
||
time of the call, everything will work fine.
|
||
|
||
* On the H8/300 and H8/300H, variable argument functions must be
|
||
implemented using the ANSI standard `stdarg.h' method of variable
|
||
arguments. Furthermore, calls to functions using `stdarg.h'
|
||
variable arguments must have a prototype for the called function
|
||
in scope at the time of the call.
|
||
|
||
|
||
File: gcc.info, Node: C++ Misunderstandings, Next: Protoize Caveats, Prev: Disappointments, Up: Trouble
|
||
|
||
Common Misunderstandings with GNU C++
|
||
=====================================
|
||
|
||
C++ is a complex language and an evolving one, and its standard
|
||
definition (the ISO C++ standard) was only recently completed. As a
|
||
result, your C++ compiler may occasionally surprise you, even when its
|
||
behavior is correct. This section discusses some areas that frequently
|
||
give rise to questions of this sort.
|
||
|
||
* Menu:
|
||
|
||
* Static Definitions:: Static member declarations are not definitions
|
||
* Temporaries:: Temporaries may vanish before you expect
|
||
* Copy Assignment:: Copy Assignment operators copy virtual bases twice
|
||
|
||
|
||
File: gcc.info, Node: Static Definitions, Next: Temporaries, Up: C++ Misunderstandings
|
||
|
||
Declare *and* Define Static Members
|
||
-----------------------------------
|
||
|
||
When a class has static data members, it is not enough to *declare*
|
||
the static member; you must also *define* it. For example:
|
||
|
||
class Foo
|
||
{
|
||
...
|
||
void method();
|
||
static int bar;
|
||
};
|
||
|
||
This declaration only establishes that the class `Foo' has an `int'
|
||
named `Foo::bar', and a member function named `Foo::method'. But you
|
||
still need to define *both* `method' and `bar' elsewhere. According to
|
||
the draft ANSI standard, you must supply an initializer in one (and
|
||
only one) source file, such as:
|
||
|
||
int Foo::bar = 0;
|
||
|
||
Other C++ compilers may not correctly implement the standard
|
||
behavior. As a result, when you switch to `g++' from one of these
|
||
compilers, you may discover that a program that appeared to work
|
||
correctly in fact does not conform to the standard: `g++' reports as
|
||
undefined symbols any static data members that lack definitions.
|
||
|