使用dyn.load在R x64中加载编译的c代码时出现问题

Sac*_*amp 7 c dll r

我最近从一台32位笔记本电脑转到64位台式机(均为win7).我刚刚发现在加载dll时使用时出现错误dyn.load.我想这是一个简单的错误,我忽略了一些事情.

例如,我写了这个简单的c函数(foo.c):

void foo( int *x) {*x = *x + 1;}
Run Code Online (Sandbox Code Playgroud)

然后在命令提示符下编译它:

R CMD SHLIB foo.c
Run Code Online (Sandbox Code Playgroud)

然后在32位RI可以在R中使用它:

> dyn.load("foo.dll")
> .C("foo",as.integer(1))
[[1]]
[1] 2
Run Code Online (Sandbox Code Playgroud)

但在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.
Run Code Online (Sandbox Code Playgroud)

编辑:

作为参考,可以使用以下方法强制在架构中强制使用R CMD --arch 64x:

R --arch x64 CMD SHLIB foo.c
Run Code Online (Sandbox Code Playgroud)

实际上很清楚,我知道我犯了一个错误的错误:)

Dav*_*nan 4

我的猜测是您正在将其编译为 32 位目标。您需要使用 64 位工具在 64 位机器上构建它。您无法将 32 位 DLL 加载到 64 位进程中,反之亦然。

  • Rtools 安装 32 位和 64 位工具。在对不同架构中使用 rtools 进行一些谷歌搜索后,我发现必须如何完成此操作: R --arch x64 CMD SHLIB foo.c (3认同)