2017-08-08 94 views
1

我是https://github.com/shians/scpipe的开发者,目前该包无法在Windows上构建。R包无法在Windows上加载DLL

Error: package or namespace load failed for 'scPipe' in inDL(x, as.logical(local), as.logical(now), ...): 
unable to load shared object 'C:/Users/pkgbuild/AppData/Local/Temp/RtmpAlOaQo/Rinst35046f5f2410/scPipe/libs/x64/scPipe.dll': 
    LoadLibrary failure: The specified module could not be found. 

满满的日志here

这个包应该是安装有

devtools::install_github("shians/scpipe") 

但显然这会失败。但它至少会安装所有相关的依赖关系,然后您可以下载源以进一步检查。

我已经监视了安装目标,以确定scPipe.dll确实存在于加载尝试时。除此之外,我不知道我还能做些什么诊断。

与Linux,macOS和Windows的唯一明显区别是Makevars文件,我根据zlibbioc和Rhtslib的说明设置了该文件。

我找不到任何可能导致此错误的资源。如果有人能够阐明这一点,将不胜感激。 This SO thread是最接近的,但我没有看到任何适用的解决方案,对我来说,用我的包改变用户的PATH设置显然是不可行的。

编辑:

Makevars.win的命令分别扩展到

Rhtslib::pkgconfig("PKG_LIBS") 
-L"C:/Users/su.s/Documents/R/win-library/3.4/Rhtslib/lib/x64" -lhts -lz -pthread -lws2_32 

zlibbioc::pkgconfig("PKG_CFLAGS") 
-I"C:/Users/su.s/Documents/R/win-library/3.4/zlibbioc/include" 

zlibbioc::pkgconfig("PKG_LIBS_shared") 
-L"C:/Users/su.s/Documents/R/win-library/3.4/zlibbioc/libs/x64" -lzlib1bioc 

,导致完全编译消息为DLL

c:/Rtools/mingw_64/bin/g++ -shared -s -static-libgcc -o scPipe.dll tmp.def RcppExports.o cellbarcode.o detect_barcode.o parsebam.o parsecount.o rcpp_scPipe_func.o transcriptmapping.o trimbarcode.o utils.o -LC:/Users/su.s/Documents/R/win-library/3.4/Rhtslib/lib/x64 -lhts -lz -pthread -lws2_32 -LC:/Users/su.s/Documents/R/win-library/3.4/zlibbioc/libs/x64 -lzlib1bioc -Ld:/Compiler/gcc-4.9.3/local330/lib/x64 -Ld:/Compiler/gcc-4.9.3/local330/lib -LC:/PROGRA~1/R/R-34~1.1/bin/x64 -lR 

其中据我可以告诉与符合规定5.8.2 of Writing R Extensions

+0

从查看源代码看来,您使用的是非标准且更复杂的文件'src/Makevars.win'。所以有些东西会破裂 - 现在你可以保留这些碎片。 –

+0

那么我只需遵循[zlibbioc](https://bioconductor.org/packages/devel/bioc/vignettes/zlibbioc/inst/doc/UsingZlibbioc.pdf)和[Rhtlsib](https://bioconductor.org)的说明/packages/release/bioc/vignettes/Rhtslib/inst/doc/Rhtslib.html)为我的Makefile.win。我想象如果包括的线是问题,那么显着更多的人会有相同的问题。 – shians

+0

我不知道这两个软件包是什么,但我高兴地将你的观点转向你,因为在CRAN **上有** 1113个工作包,在BioC上有另外90个工作包。所有这些都建立在Windows上(可能有少数依赖于Unix的库,但这些都是特例)。所以我会从这1200个工作包开始。 –

回答

0

你上面评论说:“我只是按照说明....”。很抱歉告诉你,但这些说明看起来很垃圾。我找不到任何其他在Windows上使用这种方法的软件包,它似乎是极其脆弱的;我可以使用cmd.exe安装软件包,但使用Windows bash提示失败。

无论如何,你有什么是在Windows上的链接器错误。 R在报道这些时很糟糕。您需要做的是使用--no-test-load安装软件包,然后使用“Dependency Walker”检查已安装的.dll文件。在这种情况下,生成的二进制文件对zlib1bioc.dll, 有直接的二进制依赖关系,我相信这是不受支持的。你需要重构你的代码以避免这种情况。 覆盖5.8.2,编写R扩展。

+0

我不认为DLL依赖是问题。我如果用一个默认的新C++文件生成一个新的Rstudio R包骨架,再加上'zlib.h'以及一个'gzOpen'调用,我就可以得到一个包含相同'zlib1bioc的功能性,可安装和可加载的包.dll“依赖关系。 – shians

+0

如果这是真的,那么你的包会正确加载。如果将zlib1bioc.dll复制到与scPipe.dll相同的文件夹中,您的软件包将正确加载。我已经告诉过你问题是什么,不管你信不信由你决定。 – DaBookshah

+0

另外,我希望你的意思'gzopen' – DaBookshah