[Rd] Cross-platform linking of a simple front-end
Prof Brian Ripley
ripley at stats.ox.ac.uk
Sat Jul 6 07:52:56 CEST 2013
On 06/07/2013 03:19, Simon Urbanek wrote:
> 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@
>> /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.
>> 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,
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
More information about the R-devel