在 win32 上构建 R 包:无法加载共享对象 (.dll)

Posted

技术标签:

【中文标题】在 win32 上构建 R 包:无法加载共享对象 (.dll)【英文标题】:Building R package on win32: Unable to load shared object (.dll) 【发布时间】:2020-09-03 23:42:56 【问题描述】:

我正在更新我上次在 R3.6 上发布(没有问题)的R package。我已经更新到 R 4.0.0 和 Rtools 40。

包在 64 位 R 上成功构建和运行。但我看到在 win builder 上,包的测试在 win32(但不是 win64)上失败。

为了诊断故障,我使用 32 位版本的 R 和 devtools::install(args= "--no-multiarch") 在我的 64 位 Windows 10 机器上构建包。 我已经编辑了PATH 环境变量,替换为:

C:\Program Files\R\R-4.0.0\bin\x64 C:\Program Files\R\R-4.0.0\bin\i386 C:\rtools40\mingw64\bin with C:\rtools40\mingw32\bin(我也试过 C:\rtools40\clang32\bin)

安装过程确实在寻找 g++ 和 gcc 可执行文件的 mingw32。安装成功,没有任何警告或错误。

但是,当我尝试使用 devtools::load_all() 加载包时,我看到:

Error in inDL(x, as.logical(local), as.logical(now), ...) : 
  unable to load shared object 'C:/path/to/PACKAGENAME/src/PACKAGENAME.dll':
  LoadLibrary failure:  %1 is not a valid Win32 application.

如果我改为运行library('PACKAGENAME'),然后运行测试,R GUI 将冻结并静默退出——与 win builder 上的故障平行。

我正在努力诊断为什么在 64 位上完美运行的 DLL 不能在 32 位架构上运行。我对 C++ 代码所做的唯一实质性 change 是将一些 ints 替换为 typedef int16_t xint

【问题讨论】:

【参考方案1】:

问题似乎是包的源文件夹中存在由“devtools”创建的 64 位 dll(如错误消息所示)。

一旦这些文件被删除,load_all 会很高兴地使用 32 位编译器重新创建它们。

【讨论】:

以上是关于在 win32 上构建 R 包:无法加载共享对象 (.dll)的主要内容,如果未能解决你的问题,请参考以下文章

为什么在创建特定于x86_64的共享对象时“无法使用R_X86_64_32”的CMake解决方案?

无法加载 pywin32 库 win32gui

在 Windows 上使用 C++11 和 Rcpp 构建 R 包

无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL

使用 .onLoad() 将对象加载到 R 包中的全局环境中

Win32 共享内存的包装类? (进程间通信)