Hi,

On Mon, Sep 19, 2011 at 8:23 PM, Michael Braun <[email protected]> wrote:
> I am creating an R package that includes some C++ code that I have written, 
> and some "legacy" Fortran code from another source.  I am able to build and 
> run this package on my own machine (OSX Lion 10.7.1) with no problem.  
> However, I would like some colleagues to test the package before I post it on 
> CRAN.  Unfortunately, what I have created does not appear to be portable, and 
> I would appreciate some guidance.
>
> Ideally, I would not expect my users to have the Apple developer tools, or an 
> R-friendly version of gfortran installed.  So I thought I would compile a 
> binary myself, and link to the gfortran libraries statically.

Are your colleagues also running OS X?

I think you should be able to make your life a lot easier by simply
running an `R CMD BUILD yourpkg` which (if I'm not mistaken) will
compile your package into a form your end-users/colleagues will be
able to just `R CMD INSTALL` without requiring any compilers -- just
like they can download binaries of R packages from CRAN w/o needing to
compile it themselves.

Does that help?

-steve


  My Makevars file has exactly two lines.  One is a PKG_CPPFLAGS
definition, to point to headers.  The other is
PKG_LIBS=/usr/local/lib/libgfortran.a  .  I then build the binary
using R CMD INSTALL --binary.  The compiler then does it's thing, and
when it gets to the link step, I see:
>
> g++-4.2 -arch x86_64 -dynamiclib -Wl,-headerpad_max_install_names -undefined 
> dynamic_lookup -single_module -multiply_defined suppress -o mypkg.so mypkg.o  
> /usr/local/lib/libgfortran.a -lgfortran -F/Library/Frameworks/R.framework/.. 
> -framework R -Wl,-framework -Wl,CoreFoundation
>
> Note that there is a -lgfortran that I did not include myself.
>
> Of course, I want to follow the R manuals as closely as possible.  In Section 
> 1.7.2 of "Writing R Extensions," there is advice to be aware of any 
> dependencies.  So I then ran R CMD otool -L mypkg.so , and got the following:
>
> mypkg.so:
>        mypkg.so (compatibility version 0.0.0, current version 0.0.0)
>        /usr/local/lib/libgfortran.2.dylib (compatibility version 3.0.0, 
> current version 3.0.0)
>        /Library/Frameworks/R.framework/Versions/2.13/Resources/lib/libR.dylib 
> (compatibility version 2.13.0, current version 2.13.1)
>        
> /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation 
> (compatibility version 150.0.0, current version 635.0.0)
>        /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current 
> version 52.0.0)
>        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current 
> version 159.0.0)
>
> So it looks like there are still some dependencies that, at least according 
> to Section 1.7.2, I don't want.  But I do not know how to get rid of them.  
> And when my colleague loads the file, of course there is an error, because R 
> cannot find the correct libgfortran dynamic library.
>
> I also tried something else.  I know that R comes packaged with 
> libgfortran.2.dylib in the $R_HOME/lib directory.  So what I thought I would 
> do is add -L$(R_HOME)/lib to PKG_LIBS *instead* of doing the static linking 
> thing.  The idea is that all users would have that version of gfortran in the 
> same place.  But when I do that, the linker still seems to want to link to 
> the libgfortran.3.dylib that is in /usr/local/lib, and not the 
> libgfortran.2.dylib that is in $R_HOME/lib.  This happens even if I change 
> the dynamic link of libgfortran.dylib to .2 instead of .3.  When my colleague 
> tries to load mypkg.so, he gets an error that includes:  Library not loaded: 
> /usr/local/lib/libgfortran.3.dylib
>
> So really, all I want to do is create a binary someone can just load, without 
> needing to preinstall lots of other stuff.  It doesn't matter to me if it 
> involves static linking to runtime libraries, or telling the loader where to 
> find the dynamic libraries.
>
> Thanks in advance for your help with this.  It is much appreciated.
>
>
>
> Michael Braun
> MIT Sloan School of Management
> [email protected]
>
> _______________________________________________
> R-SIG-Mac mailing list
> [email protected]
> https://stat.ethz.ch/mailman/listinfo/r-sig-mac
>
>



-- 
Steve Lianoglou
Graduate Student: Computational Systems Biology
 | Memorial Sloan-Kettering Cancer Center
 | Weill Medical College of Cornell University
Contact Info: http://cbio.mskcc.org/~lianos/contact

_______________________________________________
R-SIG-Mac mailing list
[email protected]
https://stat.ethz.ch/mailman/listinfo/r-sig-mac

Reply via email to