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

发布于 2024-10-16 17:04:22 字数 806 浏览 1 评论 0原文

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

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

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

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

R CMD SHLIB foo.c

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

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

但在 64 位 RI 中 get:

> 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.

编辑:

作为参考,可以在使用 --arch 64x 进行架构:

R --arch x64 CMD SHLIB foo.c

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

I recently went from a 32bit laptop to a 64bit desktop (both win7). I just found out that I get an error now when loading dll's using dyn.load. I guess this is a simple mistake and I am overlooking something.

For example, I write this simple c function (foo.c):

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

Then compile it in command prompt:

R CMD SHLIB foo.c

Then in 32bit R I can use it in R:

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

but in 64bit R I get:

> 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.

Edit:

For reference, R CMD can be forced in an architecture by using --arch 64x :

R --arch x64 CMD SHLIB foo.c

Quite clear actually, I knew I was making a rooky mistake:)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南汐寒笙箫 2024-10-23 17:04:22

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

My guess is that you are compiling it to a 32 bit target. You need to build it on your 64 bit machine with 64 bit tools. You can't load a 32 bit DLL into a 64 bit process, and vice versa.

请叫√我孤独 2024-10-23 17:04:22

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

what i did is to compile with --arch x64 and --arch 32 once a time and manually put corresponding .dll ( with the same name ) under separate folders src-x64 and src-i386 respectively, these two folders are under the same directory where the folder src is.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文