我最近从一台32位笔记本电脑转到64位台式机(均为win7)。我刚刚发现使用dyn.load
加载dll时出现错误。我想这是一个简单的错误,我忽略了一些事情。
例如,我编写了这个简单的c函数(foo.c):
void foo( int *x) {*x = *x + 1;}
然后在命令提示符下编译它:
R CMD SHLIB foo.c
然后在32位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.
编辑:
作为参考,可以使用--arch 64x
:
R --arch x64 CMD SHLIB foo.c
实际上非常清楚,我知道我犯了一个错误的错误:)
答案 0 :(得分:4)
我的猜测是你正在将它编译成32位目标。您需要使用64位工具在64位计算机上构建它。您不能将32位DLL加载到64位进程中,反之亦然。
答案 1 :(得分:-1)
我所做的是用--arch x64和--arch 32一次编译并手动将相应的.dll(同名)分别放在单独的文件夹src-x64和src-i386下,这两个文件夹是在文件夹src所在的同一目录下。