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.hIch 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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage