Verwenden von Rcpp mit Windows-spezifischen Includes
Ich versuche, mit Rcpp C ++ - Code zu schreiben, der auf bestimmte Dinge auf Betriebssystemebene in Windows zugreift. Sobald ich einschließewindows.h
odershlobj.h
Ich bekomme eine Reihe von Kompilierungsfehlern. Wenn ich diesen Code ausführe, funktioniert er, sodass ich weiß, dass einige der Grundlagen stimmen. Aber wenn ich eines der Windows-bezogenen auskommentiere#include
Linien, es funktioniert nicht.
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()
Hinweis: Wenn ich dies in RStudio ausführe, wird die Ausgabe voncout
undprintf
in der Konsole angezeigt, aber wenn ich es in Windows RGui ausführe, wird die Ausgabe nicht angezeigt. Ich nehme an, das hat etwas mit der Art und Weise zu tun, wie RGui mit der Textausgabe umgeht.
Wenn ich diese Include-Zeilen auskommentiere, sehen die angezeigten Fehler folgendermaßen aus:
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]
... und so weiter
Irgendwelche Tipps, wie das funktioniert?
Aktualisieren: Ich habe es geschafft, einige der Fehler zu beheben, aber einige bleiben.
Ich habe auch von derRealloc
Fehler durch Befolgen einiger Ratschläge vonhttp://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html
Dasinc
sollte ersetzt werden durch:
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;
'
Ich habe auch andere Fehler durch Bestehen beseitigt-fpermissive
an den Compiler, ab dieser Frage:Wie setze ich G ++ Compiler Flags mit Rcpp und 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')
Es gibt aber noch einige Fehler:
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