2017-08-08 169 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