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.
|
|
|