9

Rcppを使用して、WindowsのOSレベルのものにアクセスするC++コードを作成しようとしています。windows.hまたはを含めるとすぐにshlobj.h、大量のコンパイルエラーが発生します。このコードを実行すると機能するので、基本のいくつかが正しく理解されていることがわかります。しかし、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()

注:これをRStudioで実行すると、コンソールからの出力がcout表示printfされますが、Windows RGuiから実行すると、出力が表示されません。これは、RGuiがテキスト出力を処理する方法と関係があると思います。

これらのインクルード行のコメントを外すと、次のようなエラーが発生します。

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]

... 等々

これを機能させるためのヒントはありますか?


更新:エラーの一部を取り除くことができましたが、一部は残っています。

また、 http://tolstoy.newcastle.edu.au/R/e2/devel/06/11/1242.htmlReallocからのアドバイスに従って、エラーを確認しました。

を次の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とインラインを使用してg ++コンパイラフラグを設定するにはどうすればよいですか?

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
4

3 に答える 3

5

私は最後の問題を理解しました。ReallocRヘッダーとWindowsヘッダーの両方がとを定義しているように見えますFreeが、定義間にはいくつかの矛盾があります。#undefそのため、Windowsヘッダーを含める前に、これらのマクロの両方を実行する必要がありました。-fpermissiveまた、フラグをコンパイラーに渡すという問題もあります。

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()
于 2012-07-21T16:33:09.657 に答える
3

最初の概算では、Rcppは多くのC ++接着剤とテンプレートの魔法でAPIをより良くするだけなので、R自体でビルドできる場合にのみRcppでビルドできます。

したがって、これらのヘッダーをRだけでプログラムに組み込むことができない限り、Rcppでどのように構築できるかわかりません。

于 2012-07-21T03:41:31.783 に答える
0

私にもこれらのエラーがあります。そして、599行目のエラーを修正するのに長い時間がかかりました。599行目をコメントアウトし、以下の問題を修正しました。

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

このソリューションは好きではありませんが、私のプログラムは現在コンパイル中です。これを行うと将来問題が発生する可能性があるため、変更を文書化しました。誰かがより良い解決策を持っていますか?

于 2012-12-08T03:26:59.170 に答える