[Rcpp-devel] Can an Rcpp package include Fortran code?

Avraham Adler avraham.adler at gmail.com
Thu Oct 6 19:48:15 CEST 2016


On Thu, Oct 6, 2016 at 12:52 PM, Kevin Ushey <kevinushey at gmail.com> wrote:
> My best guess is that the issue here is that 'gfortran' is being used for
> linking, e.g.
>
> c:/Rtools/mingw_64/bin/gfortran -shared -s
> -Wl,--allow-multiple-definition -static-libgcc -o ForTest.dll tmp.def
> RcppExports.o VecSum_C.o VecSum_F.o -LC:/R/RLocalSoft/lib/x64
> -LC:/R/RLocalSoft/lib -LC:/R/RCurrent/R-33~1.1PA/bin/x64 -lR
>
> You likely need to force the C++ compiler (g++) to be used for linking,
> although I'm not exactly ensure how to accomplish this. Hopefully, setting
> one of:
>
>    SHLIB_LD = $(CXX)
>    SHLIB_FCLD = $(CXX)
>    DYLIB_LD = $(CXX)
>
> in your src/Makevars[.win] will be sufficient, but no guarantees...
>
> Kevin

Yes, Kevin, that was it. Unfortunately, setting Makevars[.win] in the
package doesn't help, as per
https://cran.r-project.org/doc/manuals/r-release/R-exts.html#Using-Makevars:

  "There are some macros25 which are set whilst configuring the
building of R itself and are stored in R_HOME/etcR_ARCH/Makeconf. That
makefile is included as a Makefile after Makevars[.win], and the
macros it defines can be used in macro assignments and make command
lines in the latter."


So I had to manually edit /etc/Makeconf to SHLIB_FCLD =  $(CXX). Would
you know of any way to "override" Makeconf to get the package variable
to override the Makeconf variable? Or is this something I should ask
on R-devel.

Thank you!

Avi

On Thu, Oct 6, 2016 at 12:52 PM, Kevin Ushey <kevinushey at gmail.com> wrote:
> My best guess is that the issue here is that 'gfortran' is being used for
> linking, e.g.
>
> c:/Rtools/mingw_64/bin/gfortran -shared -s
> -Wl,--allow-multiple-definition -static-libgcc -o ForTest.dll tmp.def
> RcppExports.o VecSum_C.o VecSum_F.o -LC:/R/RLocalSoft/lib/x64
> -LC:/R/RLocalSoft/lib -LC:/R/RCurrent/R-33~1.1PA/bin/x64 -lR
>
> You likely need to force the C++ compiler (g++) to be used for linking,
> although I'm not exactly ensure how to accomplish this. Hopefully, setting
> one of:
>
>    SHLIB_LD = $(CXX)
>    SHLIB_FCLD = $(CXX)
>    DYLIB_LD = $(CXX)
>
> in your src/Makevars[.win] will be sufficient, but no guarantees...
>
> Kevin
>
> On Thu, Oct 6, 2016 at 9:37 AM, Dirk Eddelbuettel <edd at debian.org> wrote:
>>
>>
>> On 6 October 2016 at 12:19, Avraham Adler wrote:
>> | Has anyone successfully created a package that uses Rcpp for C++ code
>> | and which also has Fortran code? I'm experimenting with comparing
>> | Fortran and C++ and if I could use Rcpp to handle the C++ portion, it
>> | would reduce the steepness of the learning curve.
>> |
>> | However, I haven't had success. The following C++ and Fortran snippets
>> | compile properly separately—the C++ as part of Rcpp and the Fortran
>> | using R CMD SHLIB and dynload—and the R snippets call them properly,
>> | but when I put both the .cpp and .f95 files in /src, I get the huge
>> | error posted below the files.
>> |
>> | Am I missing something simple or will having C++ and Fortran code in
>> | the same package prevent the use of Rcpp and require the old methods
>> | of calling compiled code?
>>
>> I was about to say 'sure, why not' when I remembered that Writiing R
>> Extension has something to say about this in section 1.2.4:
>>
>>      There is no guarantee that C++11 can be used in a package in
>>   combination with any other compiled language (even C), as the C++11
>>   compiler may be incompatible with the native compilers for the platform.
>>   (There are known problems mixing C++11 with Fortran.)
>>
>> but then this warning is just about C++11 and Fortran.
>>
>> That said, your description above suggests that you are "simply" too
>> optimistic about 'Rcpp Attributes' -- those do not aim to support all
>> languages. They provide a (very powerful) convenience tool for Rcpp. And
>> hence C++.
>>
>> If it works in a package, stick with a package. That gets you different
>> compilation units, and hopefully sane linking.
>>
>> Dirk
>>
>> --
>> http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org
>> _______________________________________________
>> Rcpp-devel mailing list
>> Rcpp-devel at lists.r-forge.r-project.org
>> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
>
>


More information about the Rcpp-devel mailing list