2012-07-21 3 views
7

Sto provando a scrivere un codice C++ che acceda ad alcune cose a livello di sistema operativo in Windows, usando Rcpp. Non appena includo windows.h o shlobj.h, ottengo un sacco di errori di compilazione. Quando eseguo questo codice, funziona, quindi so che sto ottenendo alcune delle nozioni di base giuste. Ma quando annullo le righe #include relative a Windows, non funziona.Utilizzo di Rcpp con specifiche di Windows include

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

Nota: Quando eseguo questo RStudio, l'uscita dal cout e printf appaiono nella console, ma quando l'eseguo da Windows RGui, non viene visualizzata l'uscita. Presumo che questo abbia qualcosa a che fare con il modo in cui RGui gestisce l'output di testo.

Quando ho rimuovere il commento quelli comprendono linee, gli errori che ricevo simile a questa:

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] 

... e così via

Eventuali suggerimenti su come fare questo lavoro?


Aggiornamento: sono riuscito a ottenere alcuni degli errori di andare via, ma alcuni rimangono.

ho anche avuto dei Realloc errori seguendo qualche consiglio da http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html

Il inc dovrebbe essere sostituito con:

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; 
' 

anche io sono liberato di altri errori passando -fpermissive al compilatore, come da questa domanda: 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') 

Ma ci ar e ancora alcuni errori:

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 

risposta

5

Ho capito l'ultimo problema. Sembra che entrambe le intestazioni R e Windows definiscano Realloc e Free, ma c'è qualche conflitto tra le definizioni. Quindi avevo bisogno di #undef entrambe quelle macro prima di includere le intestazioni di Windows. E c'è anche la questione di passare il flag -fpermissive al compilatore.

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

Ad una prima approssimazione, si può costruire solo con Rcpp se si può costruire con R se stesso come Rcpp fa solo l'API più bello con un sacco di colla C++ e magia modello.

Quindi, a meno che non si ottengano queste intestazioni per creare un programma con R da solo, non vedo come potrebbe creare con Rcpp.

+1

Grazie, hai ragione - questo sembra un problema generale con le intestazioni R e Windows. – wch

0

Ho anche questi errori. E l'errore di linea 599 mi ha richiesto molto tempo per sistemare. Ho commentato la riga 599 e risolto il problema di seguito.

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 

Non mi piace questa soluzione, ma il mio programma è in fase di compilazione ora. In questo caso potrebbero esserci dei problemi futuri, quindi ho documentato il mio cambiamento. Qualcuno ha una soluzione migliore?