2012-07-21 48 views
7

Tôi đang cố gắng viết một số mã C++ để truy cập một số thứ cấp hệ điều hành trong Windows, sử dụng Rcpp. Ngay sau khi tôi bao gồm windows.h hoặc shlobj.h, tôi nhận được một loạt lỗi biên dịch. Khi tôi chạy mã này, nó hoạt động, vì vậy tôi biết tôi đang nhận được một số điều cơ bản đúng. Nhưng khi tôi bỏ ghi chú một trong các dòng #include liên quan đến Windows, nó không hoạt động.Sử dụng Rcpp với Windows cụ thể bao gồm

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

Lưu ý: Khi tôi chạy này trong RStudio, sản lượng từ coutprintf xuất hiện trong giao diện điều khiển, nhưng khi tôi chạy nó từ Windows RGui, đầu ra không xuất hiện. Tôi cho rằng điều này có liên quan đến cách RGui xử lý đầu ra văn bản.

Khi tôi bỏ ghi chú những bao gồm dây chuyền, các lỗi tôi nhận được giống như thế này:

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] 

... và vân vân

Bất kỳ gợi ý về làm thế nào để làm cho công việc này?


Cập nhật: Tôi quản lý để có được một số lỗi ra đi, nhưng một số vẫn còn.

Tôi cũng đã nhận của Realloc lỗi bằng cách làm theo một số lời khuyên từ http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html

Các inc nên được thay thế bằng:

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

Tôi cũng đã thoát khỏi các lỗi khác bằng cách đi qua -fpermissive để trình biên dịch, như từ câu hỏi này: 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') 

Nhưng có ar e vẫn còn một số lỗi:

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 

Trả lời

5

Tôi đã tìm ra vấn đề cuối cùng. Dường như cả tiêu đề R và Windows xác định ReallocFree, nhưng có một số xung đột giữa các định nghĩa. Vì vậy, tôi cần phải #undef cả hai macro này trước khi bao gồm tiêu đề Windows. Và cũng có vấn đề truyền cờ -fpermissive tới trình biên dịch.

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

Tại một xấp xỉ đầu tiên, bạn chỉ có thể xây dựng với Rcpp nếu bạn có thể xây dựng với R chính nó như là Rcpp chỉ làm cho API đẹp hơn với rất nhiều C++ keo và mẫu ma thuật.

Vì vậy, trừ khi bạn nhận được các tiêu đề này để xây dựng trong một chương trình với R một mình, tôi không thấy làm thế nào nó có thể xây dựng với Rcpp.

+1

Cảm ơn, bạn nói đúng - có vẻ như đây là vấn đề chung với các tiêu đề R và Windows. – wch

0

Tôi cũng gặp các lỗi này. Và lỗi dòng 599 đã khiến tôi mất nhiều thời gian sửa chữa. Tôi nhận xét ra dòng 599 và sửa vấn đề dưới đây.

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 

Tôi không thích giải pháp này, nhưng bây giờ chương trình của tôi đang biên dịch. Có thể có vấn đề trong tương lai bằng cách làm điều này, vì vậy tôi ghi lại sự thay đổi của tôi. Bất cứ ai có giải pháp tốt hơn?

Các vấn đề liên quan