From ripley at stats.ox.ac.uk  Sat Jul  6 07:52:56 2013
From: ripley at stats.ox.ac.uk (Prof Brian Ripley)
Date: Sat, 06 Jul 2013 06:52:56 +0100
Subject: [Rd] Cross-platform linking of a simple front-end
In-Reply-To: <0D58AA12-6314-4277-8570-A7C87F291516@r-project.org>
References: <CAM9CR=2z8UWuwtHXV+HsbHqOF9aSe1-mYP72WTe7pf2q+zMXcg@mail.gmail.com>
	<0D58AA12-6314-4277-8570-A7C87F291516@r-project.org>
Message-ID: <51D7B0B8.8060501@stats.ox.ac.uk>

On 06/07/2013 03:19, Simon Urbanek wrote:
> Jon,
>
> On Jul 4, 2013, at 10:52 AM, Jon Clayden wrote:
>
>> Dear all,
>>
>> I have a simple front-end program which uses the APIs described in section
>> 8 of "Writing R Extensions" to deviate from the standard R behaviour in
>> fairly minor ways. However, I'm having some difficulty getting it to link
>> reliably across different platforms.
>>
>> R CMD LINK seemed like it would help, but I've had difficulty finding many
>> real-world examples online. I've tried
>>
>>   R CMD LINK $(R CMD config CC) $(R CMD config --cppflags) $(R CMD config
>> --ldflags) -o ../bin/exec/tractor tractor.c
>>
>> and this works on one of my test platforms (OS X.8.4, R 3.0.1), but not the
>> other (Ubuntu 12.04 LTS, R 2.14.1). In the latter case I get the error
>>
>>   /usr/bin/ld: /tmp/ccmKf57E.o: undefined reference to symbol 'log10@
>> @GLIBC_2.0'
>>   /usr/bin/ld: note: 'log10@@GLIBC_2.0' is defined in DSO
>> /lib/i386-linux-gnu/libm.so.6 so try adding it to the linker command line
>>   /lib/i386-linux-gnu/libm.so.6: could not read symbols: Invalid operation
>>   collect2: ld returned 1 exit status
>>
>> I can correct this by adding "-lm" manually to the command, but I'm not
>> sure how portable that will itself be.
>>
>
> My guess would be that you did not use --enable-R-shlib when compiling R on Ubuntu so you don't have a shared version of the R library to link against (which is needed to resolve the dependencies). Could that be the case?

I was able to reproduce this on Fedora: that is not the error if R was 
not built as a shared library.

I would simply copy how R does it (for R.bin in src/main).  libtool 
(used by R CMD LINK) is not coming up with the same flags.  On my system 
R is not using -lm:

gcc -std=gnu99 -Wl,--export-dynamic -fopenmp  -L/usr/local/lib64 -o 
R.bin Rmain.o  -L../../lib -lR -lRblas


Adding -lm is not portable (some OSes do not have a separate libm and 
some always add it when linking via $(CC)), but there is a LIBM macro in 
etc/Makeconf which tells you if configure found one.



> Cheers,
> Simon
>
>
>> Could anyone advise on the best way to make this work portably, please? For
>> this application I'm not concerned about Windows compatibility -
>> portability across Unix-alikes is sufficient. The source code is at <
>> https://github.com/jonclayden/tractor/blob/master/src/tractor.c>, if that
>> is useful.
>>
>> All the best,
>> Jon



-- 
Brian D. Ripley,                  ripley at stats.ox.ac.uk
Professor of Applied Statistics,  http://www.stats.ox.ac.uk/~ripley/
University of Oxford,             Tel:  +44 1865 272861 (self)
1 South Parks Road,                     +44 1865 272866 (PA)
Oxford OX1 3TG, UK                Fax:  +44 1865 272595



[Rd] Cross-platform linking of a simple front-end
Prof Brian Ripley