[Rcpp-devel] Compiling RcppArmadillo through R CMD SHLIB on Windows XP
Dirk Eddelbuettel
edd at debian.org
Tue Dec 14 16:55:55 CET 2010
On 13 December 2010 at 12:23, Savitsky, Terrance wrote:
| Hello Romain, Thank you for your expertise. I will use the documentation to make a package. At this point, however, I want to see every method I've tried work, however, so that I understand any and all differences I might expect for developing with Rcpp/RcppArmadillo under Windows XP. So I followed the process (using Verbose=TRUE under an inline invocation) with the bla.cpp you included for me to obtain PKG_LIBS and CLINK-CPPFLAGS values. When I return to my cygwin bash shell session and attempt to compile and link bla.cpp, it does now seem to properly source my #include<RcppArmadillo.h>. statement. I do, however, receive the following error: 'snprintf' is not a member of 'std'. So I guess I'm missing a header linked to std::snprintf. The only thing that comes to mind is that I have somehow corrupted my installation of Rcpp. I would appreciate any insight you would offer.
snprintf is defined in the cstdio header.
Dirk
|
| Thanks, Terrance Savitsky
|
| -----Original Message-----
| From: Romain Francois [mailto:romain at r-enthusiasts.com]
| Sent: Sunday, December 12, 2010 3:58 AM
| To: Savitsky, Terrance
| Cc: rcpp-devel at r-forge.wu-wien.ac.at
| Subject: Re: [Rcpp-devel] Compiling RcppArmadillo through R CMD SHLIB on Windows XP
|
| Le 12/12/10 04:03, Savitsky, Terrance a écrit :
| > Hello,
| >
| > I employ a variant of the following lines in a cygwin bash session in
| > Windows XP to compile my .cpp file.
| >
| > $ export PKG_LIBS=`Rscript.exe -e "RcppArmadillo:::LdFlags()"`
| >
| > $ export PKG_CXXFLAGS=`Rscript.exe -e "RcppArmadillo:::CxxFlags()"`
| >
| > $ R CMD SHLIB fastLm.cpp
| >
| > I receive the following compile error:
| >
| > G++ -I"C:/PROGRA~1/R/R-212~1.0/include" Rscript.exe -e
| > "RcppArmadillo:::CxxxFlags()" -O2 - Wall -pedantic - c fastLm.cpp - o
| > fastLm.o
| >
| > G++:Rscript.exe: No such file or directory
| >
| > fastLm.cpp:1:27: error: RcppArmadillo.h: No such file or directory
| >
| > fastLm.cpp:2: error: 'SEXP' does not have name a type
| >
| > I've included the R bin directory containing Rscript.exe to the PATH
| > environment statement. Should one use a different syntax for windows to
| > capture RcppArmadillo dependencies? (Fyi, I am able to build using
| > inline, though my code is 600 lines and I will have multiple versions,
| > so using the old approach may provide the most modular de-bugging
| > approach vs. re-installing a package as I add files).
| >
| > Thanks, Terrance Savitsky
|
| Hello,
|
| I would strongly advise you to make it a package, especially if you deal
| with multiple files, etc ...
|
| One thing you might want to consider is to use the verbose argument of
| cxxfunction, so that inline shows you how it runs the show.
|
| For example:
|
| require(RcppArmadillo)
| require(inline)
|
| f <- cxxfunction( , '
| arma::mat x(2,2) ;
| NumericMatrix res = wrap( x + x ) ;
| return res ;
| ', plugin = "RcppArmadillo", verbose = TRUE )
|
| When you run this, you'll see what inline does with the PKG_LIBS, etc ...:
|
| For example, it shows me this on OSX:
|
| romain at naxos ~/svn/rcpp/pkg $ Rscript bla.R
| Le chargement a nécessité le package : RcppArmadillo
| Le chargement a nécessité le package : Rcpp
| Le chargement a nécessité le package : methods
| Le chargement a nécessité le package : inline
| >> setting environment variables:
| PKG_LIBS =
| /Library/Frameworks/R.framework/Versions/2.12/Resources/library/Rcpp/lib/x86_64/libRcpp.a
| $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)
|
| >> LinkingTo : RcppArmadillo, Rcpp
| CLINK_CPPFLAGS =
| -I"/Library/Frameworks/R.framework/Versions/2.12/Resources/library/RcppArmadillo/include"
| -I"/Library/Frameworks/R.framework/Versions/2.12/Resources/library/Rcpp/include"
|
|
| >> Program source :
|
| 1 :
| 2 : // includes from the plugin
| 3 : #include <RcppArmadillo.h>
| 4 : #include <Rcpp.h>
| 5 :
| 6 :
| 7 : #ifndef BEGIN_RCPP
| 8 : #define BEGIN_RCPP
| 9 : #endif
| 10 :
| 11 : #ifndef END_RCPP
| 12 : #define END_RCPP
| 13 : #endif
| 14 :
| 15 : using namespace Rcpp;
| 16 :
| 17 :
| 18 : // user includes
| 19 :
| 20 :
| 21 : // declarations
| 22 : extern "C" {
| 23 : SEXP file313a14a1( ) ;
| 24 : }
| 25 :
| 26 : // definition
| 27 :
| 28 : SEXP file313a14a1( ){
| 29 : BEGIN_RCPP
| 30 :
| 31 : arma::mat x(2,2) ;
| 32 : NumericMatrix res = wrap( x + x ) ;
| 33 : return res ;
| 34 :
| 35 : END_RCPP
| 36 : }
| 37 :
| 38 :
| Compilation argument:
| /Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB
| file313a14a1.cpp 2> file313a14a1.cpp.err.txt
| g++ -arch x86_64 -I/Library/Frameworks/R.framework/Resources/include
| -I/Library/Frameworks/R.framework/Resources/include/x86_64
| -I/usr/local/include
| -I"/Library/Frameworks/R.framework/Versions/2.12/Resources/library/RcppArmadillo/include"
| -I"/Library/Frameworks/R.framework/Versions/2.12/Resources/library/Rcpp/include"
| -fPIC -g -O3 -Wall -pipe -c file313a14a1.cpp -o file313a14a1.o
| g++ -arch x86_64 -dynamiclib -Wl,-headerpad_max_install_names -undefined
| dynamic_lookup -single_module -multiply_defined suppress
| -L/usr/local/lib -o file313a14a1.so file313a14a1.o
| /Library/Frameworks/R.framework/Versions/2.12/Resources/library/Rcpp/lib/x86_64/libRcpp.a
| -L/Library/Frameworks/R.framework/Resources/lib/x86_64 -lRlapack
| -L/Library/Frameworks/R.framework/Resources/lib/x86_64 -lRblas
| -lgfortran -F/Library/Frameworks/R.framework/.. -framework R
| -Wl,-framework -Wl,CoreFoundation
|
| Then you can just hardcode PKG_LIBS and CLINK_CPPFLAGS (or use
| PKG_CPPFLAGS if you prefer).
|
|
|
| Another tip with inline is that you can read the code from a file, e.g :
|
| f <- cxxfunction( ,
| paste( readLines("bla.cpp"), collapse = "\n") ,
| plugin = "RcppArmadillo", verbose = TRUE )
|
| This way you can import multiple files, etc ... while keeping the C++
| code out of the R code. I would still however very strongly recommend
| you to make a package. It is well documented, easy and it will save you
| some time.
|
| Romain
|
| --
| Romain Francois
| Professional R Enthusiast
| +33(0) 6 28 91 30 30
| http://romainfrancois.blog.free.fr
| |- http://bit.ly/fT2rZM : highlight 0.2-5
| |- http://bit.ly/gpCSpH : Evolution of Rcpp code size
| `- http://bit.ly/hovakS : RcppGSL initial release
|
|
|
| __________________________________________________________________________
|
| This email message is for the sole use of the intended recipient(s) and
| may contain confidential information. Any unauthorized review, use,
| disclosure or distribution is prohibited. If you are not the intended
| recipient, please contact the sender by reply email and destroy all copies
| of the original message.
|
| _______________________________________________
| 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
--
Dirk Eddelbuettel | edd at debian.org | http://dirk.eddelbuettel.com
More information about the Rcpp-devel
mailing list