2012-07-21 24 views
7

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 

Antwort

5

Ich habe das letzte Problem herausgefunden. Es sieht so aus, als ob die R- und Windows-Header und Free definieren, aber es gibt einige Konflikte zwischen den Definitionen. So musste ich diese beiden Makros #undef bevor die Windows-Header enthalten. Und es gibt auch die Frage, den -fpermissive Flag an den Compiler zu übergeben.

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() 
3

In erster Näherung kann man nur mit RCPP bauen, wenn man mit R aufbauen kann sich als RCPP macht nur die API schöner mit vielen C++ Leim und Vorlage Magie.

Also, wenn Sie diese Header nicht in einem Programm mit R allein erstellen, sehe ich nicht, wie es mit Rcpp erstellen könnte.

+1

Danke, Sie haben Recht - das sieht wie ein allgemeines Problem mit R- und Windows-Headern aus. – wch

0

Ich habe diese Fehler auch. Und der Fehler in der Zeile 599 hat mich lange Zeit in Ordnung gebracht. Ich habe die Zeile 599 auskommentiert und das Problem unten behoben.

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 

Ich mag diese Lösung nicht, aber mein Programm kompiliert jetzt. Es könnte zukünftige Probleme geben, also habe ich meine Änderung dokumentiert. Hat jemand eine bessere Lösung?