Using Rcpp with Windows-specific includes
r, rcpp
Solution
I figured out the last problem. It looks like both the R and Windows headers define `Realloc` and `Free`, but there's some conflict between the definitions. So I needed to `#undef` both of those macros before including the Windows headers. And there's also the matter of passing the `-fpermissive` flag to the compiler.
library(Rcpp)
library(inline)
inc <- '
// Taken from http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html
// Undefine the Realloc macro, which is defined by both R and by Windows stuff
#undef Realloc
// Also need to undefine the Free macro
#undef Free
#include <windows.h>
#include <iostream>
#include <stdio.h>
using namespace std;
'
src <- '
cout << "foo\\n";
printf("foo2\\n");
return Rcpp::wrap(20);
'
# Need this for the Windows headers to work
# Set -fpermissive, from: http://stackoverflow.com/questions/7063265/how-to-set-g-compiler-flags-using-rcpp-and-inline
settings <- getPlugin("Rcpp")
settings$env$PKG_CXXFLAGS <- paste('-fpermissive',settings$env$PKG_CXXFLAGS,sep=' ')
fun <- cxxfunction(signature(),
includes = inc,
src,
plugin = "Rcpp",
settings = settings)
fun()
Problem
I'm trying to write some C++ code that accesses some OS-level things in Windows, using Rcpp. As soon as I include `windows.h` or `shlobj.h`, I get a bunch of compilation errors. When I run this code, it works, so I know I'm getting some of the basics right. But when I uncomment either of the Windows-related `#include` lines, it doesn't work. ``` library(inline) inc <- ' #include <iostream> #include <stdio.h> // #include <windows.h> // #include <shlobj.h> using namespace std; ' src <- ' cout << "foo\\n"; printf("foo2\\n"); return Rcpp::wrap(20); ' fun <- cxxfunction(signature(), includes = inc, src, plugin="Rcpp") fun() ``` Note: When I run this in RStudio, the output from `cout` and `printf` appear in the console, but when I run it from the Windows RGui, the output doesn't appear. I assume this has something to do with the way RGui handles text output. When I uncomment those include lines, the errors I get look like this: ``` In file included from c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objbase.h:154:0, from c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/ole2.h:16, from c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/windows.h:94, from file43c2f9e3518.cpp:22: c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objidl.h:598:52: error: macro "Realloc" requires 3 arguments, but only 2 given c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objidl.h:598:56: error: ISO C++ forbids initialization of member 'Realloc' [-fpermissive] c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objidl.h:598:56: error: making 'Realloc' static [-fpermissive] ``` ... and so on Any hints on how to make this work? Update: I managed to get some of the errors to go away, but some remain. I also got of the `Realloc` errors by following some advice from http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html The `inc` should be replaced with: ``` inc <- ' #include <iostream> #include <stdio.h> // This is taken from http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html #include <R.h> #undef Realloc #define R_Realloc(p,n,t) (t *) R_chk_realloc( (void *)(p), (size_t)((n) * sizeof(t)) ) #include <shlobj.h> using namespace std; ' ``` I also got rid of other errors by passing `-fpermissive` to the compiler, as from this question: How to set g++ compiler flags using Rcpp and inline? ``` settings <- getPlugin("Rcpp") settings$env$PKG_CXXFLAGS <- paste('-fpermissive',settings$env$PKG_CXXFLAGS,sep=' ') fun <- cxxfunction(signature(), includes = inc, src, plugin = "Rcpp", settings = settings) Sys.unsetenv('PKG_CXXFLAGS') ``` But there are still some errors: ``` In file included from c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objbase.h:154:0, from c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/ole2.h:16, from c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/shlobj.h:86, from file43c267d3279.cpp:26: c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objidl.h:599:25: error: expected identifier before '(' token c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objidl.h:599:25: error: 'parameter' declared as function returning a function c:\rtools\gcc-4.6.3\bin\../lib/gcc/i686-w64-mingw32/4.6.3/../../../../i686-w64-mingw32/include/objidl.h:599:25: error: expected ')' before ',' token ```