Ich versuche, einige C++ - Code zu schreiben, der mit Rcpp auf einige Dinge auf Betriebssystemebene in Windows zugreift. Sobald ich windows.h
oder shlobj.h
einfüge, bekomme ich eine Reihe von Kompilierungsfehlern. Wenn ich diesen Code ausführe, funktioniert es, also weiß ich, dass ich einige der Grundlagen richtig verstanden habe. Aber wenn ich eine der Windows-bezogenen #include
Zeilen auskommentiere, funktioniert es nicht.Verwenden von Rcpp mit Windows-spezifischen Includes
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 laufe, die Ausgabe von cout
und printf
in der Konsole angezeigt werden, aber wenn ich es von der Windows Rgui ausführen, wird die Ausgabe nicht angezeigt. Ich nehme an, das hat etwas damit zu tun, wie RGui die Textausgabe handhabt.
Als ich Kommentar- jene Linien umfassen, die Fehler, die ich wie folgt aussehen erhalten:
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 Hinweise, wie diese Arbeit zu machen?
aktualisieren: konnte ich einige der Fehler weg zu gehen, aber einige bleiben.
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 von anderen Fehlern befreien, indem -fpermissive
an den Compiler vorbei, wie:
Ich habe auch der Realloc
Fehler durch folgenden einige Ratschläge von http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html
Die inc
sollte ersetzt werden durch von dieser Frage: 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')
Aber es ar e 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
Danke, Sie haben Recht - das sieht wie ein allgemeines Problem mit R- und Windows-Headern aus. – wch