[R] Two problems compiling my shared library...

Kort, Eric Eric.Kort at vai.org
Tue Dec 20 22:12:27 CET 2005


Since requests keep trickling in, I have finally gotten around to
polishing my rtiff package for R.  This package will read TIFF images
into a pixmap for subsequent processing.

However, I am encountering a couple problems with compiling the shared
library.

1. On windows (R 2.2.0): R CMD INSTALL successfully compiles a dll, but
the dll has no entry points (as revealed by nm rtiff.dll), leading to "C
entry point ... not in load table" errors when I try to use the library.
Here is how R CMD INSTALL built the dll:

-------8<--------------------------------------------------------------
MkRules:143: warning: ignoring old commands for target `.c.o'
making rtiff.d from rtiff.c
g++   -Ic:/usr/include -Wall -O2   -c rtiff.c -o rtiff.o
rtiff.c: In function `void reduce(int*, int*, int*, int*, double*)':
rtiff.c:138: warning: converting to `int' from `double'
rtiff.c:139: warning: converting to `int' from `double'
ar cr rtiff.a rtiff.o
ranlib rtiff.a
windres --include-dir c:/usr/include  -i rtiff_res.rc -o rtiff_res.o
gcc  --shared -s  -o rtiff.dll rtiff.def rtiff.a rtiff_res.o
-Lc:/usr/src/gnuwin32  -ltiff  -lg2c -lR
  ... DLL made
-------8<--------------------------------------------------------------

However, if I simply do the following:

gcc -shared -o rtiff.dll rtiff.c -ltiff

I get a functional shared library.

Any clues as to why R CMD INSTALL is resulting in an entry-pointless
dll?  (And couldn't the shared library compilation be greatly simplified
as I have demonstrated above?)

2. On (ubuntu) Linux (R 2.1.0):  R CMD INSTALL results in an rtiff.so
that crashes with a segmentation fault.  Again, gcc -shared -o rtiff.so
rtiff.c -ltiff results in a function shared library.  

Here, I have traced the problem to the -O2 flag with which R was
compiled.  If I "hand compile" with the -O2 flag, I get the segmentation
fault back.  A search of the internet suggests this is likely a GCC bug,
which perhaps I could patch, but I don't want to expect potential users
of my library to have to patch their GCC.

So...can I eliminate the -O2 option via Makevars somehow, or do I need
my own custom Makefile to get around this?

Thank you,

Eric
This email message, including any attachments, is for the so...{{dropped}}




More information about the R-help mailing list