在 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
环境变量,替换为:
安装过程确实在寻找 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 是将一些 int
s 替换为 typedef int16_t xint
。
【问题讨论】:
【参考方案1】:问题似乎是包的源文件夹中存在由“devtools”创建的 64 位 dll(如错误消息所示)。
一旦这些文件被删除,load_all
会很高兴地使用 32 位编译器重新创建它们。
【讨论】:
以上是关于在 win32 上构建 R 包:无法加载共享对象 (.dll)的主要内容,如果未能解决你的问题,请参考以下文章
为什么在创建特定于x86_64的共享对象时“无法使用R_X86_64_32”的CMake解决方案?
在 Windows 上使用 C++11 和 Rcpp 构建 R 包
无法在 32 位机器上注册使用 VS2012/VC++ 构建的 COM DLL