On Mon, 12 Jan 2009, Simon Urbanek wrote:
On Jan 12, 2009, at 7:59 , Hadassa Brunschwig wrote:
<snip>
I obtain errors of the sort:
ld: multiple definitions of symbol _ivector
nrutil.o definition of _ivector in section (__TEXT,__text)
tools.o definition of _ivector in section (__TEXT,__text)
I read somewhere that this is due to multiple compilers but I am not
sure about that.
No, this is a bug in your code - it's because you have multiple definitions of
the same symbol (ivector). If you want the two symbols to be the same across
modules, you must declare it external in one of the two files. If you want
them separate, declare both static.
It might be worth pointing out that this is an area where C compilers differ.
Many compilers permit multiple definitions: if they are the same, the behaviour
is as if all but one are extern and if they are not the same the behaviour is
undefined or implementation-defined. I have read (I don't know if it's true)
that this handling of multiple definitions was actually necessary for the early
C++ compilers that compiled to C.
There's some discussion in the Rationale to the C standard
http://www.lysator.liu.se/c/rat/c1.html#3-1-2-2
Anyway, Simon is right that the Apple gcc demands that there is an extern on
all but one declaration, and the Standard allows the compiler to demand this,
and a program written this way will work correctly on compilers that have
different views, so it's a good way to write.
-thomas
Thomas Lumley Assoc. Professor, Biostatistics
[email protected] University of Washington, Seattle
_______________________________________________
R-SIG-Mac mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-sig-mac