NREL中c库ssc.dll的Rcpp包装器-加载dll时出现问题

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文件复制到

我正在为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如下

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()”的自包含文章

谢谢你的帖子。要澄清SSC库是一个C库,并且没有C++名称的问题。我希望通过Rcpp包装一个“普通的旧”C库。我只需要将适当的DLL(32位bot x86或64位x64)复制到DLL RcppSCC所在的lib目录。我正在寻找有关如何修改Makevars.win以实现此目的的帮助。没有计划把这个放在CRAN上,但我很高兴在你的神奇Rcpp画廊网站上分享我的作品,一旦我能让它工作。当我将DLL添加到路径中时,模块的加载起了作用。因此,这是Windows路径的问题。构建所依据的dll必须位于路径的某个位置。这并不是Rcpp真正能帮助你的。