将 Rcpp 与特定于 Windows 的包含一起使用 [英] Using Rcpp with Windows-specific includes

查看:27
本文介绍了将 Rcpp 与特定于 Windows 的包含一起使用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 Rcpp 编写一些 C++ 代码来访问 Windows 中的一些操作系统级别的东西.一旦我包含 windows.hshlobj.h,我就会收到一堆编译错误.当我运行此代码时,它可以工作,所以我知道我掌握了一些基础知识.但是当我取消注释任何一个与 Windows 相关的 #include 行时,它不起作用.

I'm trying to write some C++ code that accesses some OS-level things in Windows, using Rcpp. As soon as I include windows.h or shlobj.h, I get a bunch of compilation errors. When I run this code, it works, so I know I'm getting some of the basics right. But when I uncomment either of the Windows-related #include lines, it doesn't work.

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

注意:当我在 RStudio 中运行它时,coutprintf 的输出出现在控制台中,但是当我从 Windows RGui 运行它时,输出没有不出现.我认为这与 RGui 处理文本输出的方式有关.

Note: When I run this in RStudio, the output from cout and printf appear in the console, but when I run it from the Windows RGui, the output doesn't appear. I assume this has something to do with the way RGui handles text output.

当我取消注释那些包含行时,我得到的错误如下所示:

When I uncomment those include lines, the errors I get look like this:

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]

...等等

关于如何使这项工作有任何提示?

Any hints on how to make this work?

更新:我设法消除了一些错误,但仍有一些错误.

Update: I managed to get some of the errors to go away, but some remain.

通过遵循 http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html

I also got of the Realloc errors by following some advice from http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.html

inc 应替换为:

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

我还通过将 -fpermissive 传递给编译器来消除其他错误,就像这个问题一样:如何使用 Rcpp 和 inline 设置 g++ 编译器标志?

I also got rid of other errors by passing -fpermissive to the compiler, as from this question: 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')

但是还是有一些错误:

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

推荐答案

我想出了最后一个问题.看起来 R 和 Windows 头文件都定义了 ReallocFree,但定义之间存在一些冲突.所以我需要在包含 Windows 头文件之前 #undef 这两个宏.还有将 -fpermissive 标志传递给编译器的问题.

I figured out the last problem. It looks like both the R and Windows headers define Realloc and Free, but there's some conflict between the definitions. So I needed to #undef both of those macros before including the Windows headers. And there's also the matter of passing the -fpermissive flag to the compiler.

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

这篇关于将 Rcpp 与特定于 Windows 的包含一起使用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆