[R-SIG-Mac] ld: multiple definitions of symbol
Thomas Lumley
tlumley at u.washington.edu
Tue Jan 13 09:25:04 CET 2009
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
tlumley at u.washington.edu University of Washington, Seattle
More information about the R-SIG-Mac
mailing list