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

问题描述 投票:0回答:1

我正在更新我最近在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 with C:\ Program Files \ R \ R-4.0.0 \ bin \ i386
  • C:\ rtools40 \ mingw64 \ bin with C:\ rtools40 \ mingw32 \ bin(我也尝试过C:\ rtools40 \ clang32 \ bin)

安装过程确实希望将mingw 32用于g ++和gcc可执行文件。安装成功,没有警告或错误。

但是,当我尝试用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替换为typedef int16_t xint

c++ r dll 32bit-64bit r-package
1个回答
0
投票

问题似乎是软件包的源文件夹中存在64位dll(由错误消息暗示),由'devtools'创建。

一旦删除这些文件,load_all就会使用32位编译器愉快地重新创建它们。

© www.soinside.com 2019 - 2024. All rights reserved.