2011-02-06 6 views
7

最近32ビットのラップトップから64ビットのデスクトップに移行しました(どちらもwin7)。私はちょうどdyn.loadを使用しているDLLを読み込んでいるとき私は今エラーを取得したことを知った。私はこれは簡単な間違いだと思うし、何かを見落としている。コマンドプロンプトでコンパイルそしてdyn.loadを使用してR x64にコンパイル済みのCコードをロードする際の問題

void foo(int *x) {*x = *x + 1;} 

例えば、私はこの単純なC関数(foo.cの)を書き込む

R CMD SHLIB foo.c 

そして32ビットRIにRでそれを使用することができます。

> dyn.load("foo.dll") 
> .C("foo",as.integer(1)) 
[[1]] 
[1] 2 

が、64ビットで

取得RI:

> dyn.load("foo.dll") 
Error in inDL(x, as.logical(local), as.logical(now), ...) : 
    unable to load shared object 'C:/Users/Sacha/Documents/R/foo.dll': 
    LoadLibrary failure: %1 is not a valid Win32 application. 
nd. 

編集:

参考のため、R CMDは--arch 64xを使用することによってアーキテクチャに強制することができます。

R --arch x64 CMD SHLIB foo.c 

かなり明確実際に、私はrookyミスを作っていた知っていた:)

答えて

4

私の推測では、それを32ビットのターゲットにコンパイルしています。あなたは、64ビットツールで64ビットマシンにそれを構築する必要があります。 32ビットDLLを64ビットプロセスにロードすることはできません。その逆もありません。

+0

ありがとうございました。最新のRtoolsがインストールされた64ビットマシンでこれを構築しました。とにかく32bitバージョンを構築しているのかもしれませんか? –

+0

これはDependency Walkerで確認できます –

+0

これは実際にはfoo.dllがx86用です。それでは、R CMD SHLIBにx64 dllを強制するにはどうすればいいですか? –

-1

--arch x64と--arch32で一度にコンパイルし、対応する.dll(同じ名前)を別々のフォルダsrc-x64とsrc-i386にそれぞれ置くと、これらの2つのフォルダフォルダsrcと同じディレクトリの下にあります。

関連する問題