【问题标题】:Problem with loading compiled c code in R x64 using dyn.load使用 dyn.load 在 R x64 中加载编译的 c 代码的问题
【发布时间】:2011-02-06 23:12:47
【问题描述】:

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

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

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

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

R CMD SHLIB foo.c

然后在 32bit R 中我可以在 R 中使用它:

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

但在 64 位 R 中我得到:

> 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

其实很清楚,我知道我犯了一个新手错误:)

【问题讨论】:

    标签: c r dll


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我确实在安装了最新 Rtools 的 64 位机器上构建了这个。也许它正在构建 32 位版本?
    • 您可以使用 Dependency Walker 进行检查
    • 使用它,确实 foo.dll 是用于 x86 的。那么如何强制 R CMD SHLIB 制作 x64 dll?
    • 您将需要 64 位版本的 Rtools(显然!)我实际上对 Rtools 一无所知,所以我没有提供任何更有用的东西。对不起。 Rtools 网站使安装 64 位工具听起来很容易:murdoch-sutherland.com/Rtools
    • Rtools 安装 32 位和 64 位工具。在对在不同架构中使用 rtools 进行了一些谷歌搜索后,我发现必须如何做到这一点: R --arch x64 CMD SHLIB foo.c
    【解决方案2】:

    我所做的是每次编译一次--arch x64和--arch 32并手动将相应的.dll(同名)分别放在单独的文件夹src-x64和src-i386下,这两个文件夹是在文件夹 src 所在的同一目录下。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      相关资源
      最近更新 更多