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

Reply via email to