NREL中c库ssc.dll的Rcpp包装器-加载dll时出现问题
我正在为NREL开发的太阳能光伏模拟库开发R-binding。 我能够成功地编译我使用Rcpp编写的R扩展RcppSSC。我是从RCPP画廊和Dirk Eddelbuettel的无缝R+和C++集成(Rcpp的R!)的例子中得到的。 NREL的ssc库具有x86和x64.lib和.dll文件。在RStudio中构建和测试模块时,出现以下错误。 我检查了负载相关性,RcppSCC.dll需要ssc.dll 我想我需要修改Makevars文件,以便在构建期间将ssc.lib和ssc.dll文件复制到适当的位置。我该怎么做 非常感谢您的指导或帮助。我非常喜欢C,C++,制作等。没有开发R扩展或基于RCPP的模块的经验。 我在链接过程中遇到了一些问题,我很容易就解决了 我的Makevars.win如下NREL中c库ssc.dll的Rcpp包装器-加载dll时出现问题,dll,rcpp,Dll,Rcpp,我正在为NREL开发的太阳能光伏模拟库开发R-binding。 我能够成功地编译我使用Rcpp编写的R扩展RcppSSC。我是从RCPP画廊和Dirk Eddelbuettel的无缝R+和C++集成(Rcpp的R!)的例子中得到的。 NREL的ssc库具有x86和x64.lib和.dll文件。在RStudio中构建和测试模块时,出现以下错误。 我检查了负载相关性,RcppSCC.dll需要ssc.dll 我想我需要修改Makevars文件,以便在构建期间将ssc.lib和ssc.dll文件复制到
PKG_CPPFLAGS += -I. -I"C:/SAM/ssc-sdk-2014-1-21"
ifeq "$(WIN)" "64"
PKG_LIBS += -L"C:/SAM/ssc-sdk-2014-1-21/win64/" -lssc
else
PKG_LIBS += -L"C:/SAM/ssc-sdk-2014-1-21/win32/" -lssc
endif
=============================RStudio error message====================================
==> Rcmd.exe INSTALL --preclean --no-multiarch --with-keep.source RcppSSC
* installing to library 'C:/Users/kumar_000/Documents/R/win-library/3.1'
* installing *source* package 'RcppSSC' ...
** libs
g++ -m64 -I"C:/PROGRA~1/R/R-31~1.1/include" -DNDEBUG -I. -I"C:/SAM/ssc-sdk-2014-1-21" -I"C:/Users/kumar_000/Documents/R/win-library/3.1/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include" -O2 -Wall -mtune=core2 -c RcppExports.cpp -o RcppExports.o
g++ -m64 -I"C:/PROGRA~1/R/R-31~1.1/include" -DNDEBUG -I. -I"C:/SAM/ssc-sdk-2014-1-21" -I"C:/Users/kumar_000/Documents/R/win-library/3.1/Rcpp/include" -I"d:/RCompile/CRANpkg/extralibs64/local/include" -O2 -Wall -mtune=core2 -c RcppSSC.cpp -o RcppSSC.o
g++ -m64 -shared -s -static-libgcc -o RcppSSC.dll tmp.def RcppExports.o RcppSSC.o -LC:/SAM/ssc-sdk-2014-1-21/win64/ -lssc -Ld:/RCompile/CRANpkg/extralibs64/local/lib/x64 -Ld:/RCompile/CRANpkg/extralibs64/local/lib -LC:/PROGRA~1/R/R-31~1.1/bin/x64 -lR
installing to C:/Users/kumar_000/Documents/R/win-library/3.1/RcppSSC/libs/x64
** R
** preparing package for lazy loading
** help
*** installing help indices
** building package indices
** testing if installed package can be loaded
Error in inDL(x, as.logical(local), as.logical(now), ...) :
unable to load shared object 'C:/Users/kumar_000/Documents/R/win-library/3.1/RcppSSC/libs/x64/RcppSSC.dll':
LoadLibrary failure: The specified module could not be found.
Error: loading failed
Execution halted
ERROR: loading failed
* removing 'C:/Users/kumar_000/Documents/R/win-library/3.1/RcppSSC'
Exited with status 1.
到第一个近似,你不能将C++代码与RooToogle+(G++)和VisualStudio(DLL)混合。这与C++内部结构和符号的非标准化有关。 这是相当广泛的记录,如Rcpp常见问题
你可以在两个之间创建一个简单的C层,因为这避免了问题的发生,但是这是一个“你在编译编译器和B时仍然很棘手”,这与Rcpp /C++的许多/大部分好处相比。 现在,我可能也误解了你的问题。如果您只想在R在其路径中找到DLL的位置复制DLL,一种廉价(而且欺骗)的方法是将其放入R的bin目录中。我可能曾经为一个工作项目使用过一个供应商库,它显然无法在CRAN上运行——但在那里,您通常不能使用非开源库
如果您自己实际编译了DLL,那么现有的包(如eg RSQLite和RPostgreSQL)实际上会动态地构建一个库供R包使用,即使在Windows上也是如此 编辑:谢谢你的后续评论。这里还有一些要点:- 我似乎记得DLL必须在路径中,而不仅仅是在包中。因此,为了测试这一点,只需将其复制到R的bin目录中,然后查看包是否以这种方式加载
- 我喜欢通过示例来工作,所以请看一下Rcpp和RInside中一些更复杂的
——也许这会给您一个想法Makevars.win
- 还考虑POST到RCPP DeVel:两个精明的Windows用户RCPP潜伏在那里,可以帮助;他们不太可能看到这一点
- 最后,Rcpp库将需要我们可以在Linux上“sourceCpp()”的自包含文章