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ừ cout
và printf
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
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