【问题标题】:Problem in package creation no DLL was created in R包创建中的问题没有在 R 中创建 DLL
【发布时间】:2021-10-14 13:55:42
【问题描述】:

我使用带有 R 版本 4.1.0 的 Windows 10。我想创建一个包含 Rcpp 和 RcppArmadillo 代码的包。现在 Rcpp 代码正在无错误地编译并提供答案。但是在编译包时会出现奇怪的问题。

我尝试编辑命名空间

useDynLib(sagnik, .registration = TRUE)
exportPattern("^[[:alpha:]]+")
importFrom(Rcpp,sourceCpp,evalCpp))

尝试编辑 Makevars.win

CXX_STD = CXX11

PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) 
PKG_LIBS = $(shell $(R_HOME)/bin${R_ARCH_BIN}/Rscript.exe -e "Rcpp:::LdFlags()") $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

和 Makevars

CXX_STD = CXX11

PKG_CXXFLAGS = $(SHLIB_OPENMP_CXXFLAGS) 
PKG_LIBS = $(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()") $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

但使用 CLEAN & REBUILD 时仍显示以下错误

==> Rcpp::compileAttributes()

* Updated src/RcppExports.cpp
* Updated R/RcppExports.R

==> Rcmd.exe INSTALL --preclean --no-multiarch --with-keep.source hijibijibij

* installing to library 'C:/Users/sagni/Documents/R/win-library/4.1'
* installing *source* package 'SBHSdemo' ...
** using staged installation
** libs
/mingw64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-4.1.0/include" -DNDEBUG  -I'C:/Users/sagni/Documents/R/win-library/4.1/Rcpp/include' -I'C:/Users/sagni/Documents/R/win-library/4.1/RcppArmadillo/include'     -fopenmp    -O2 -Wall  -mfpmath=sse -msse2 -mstackrealign  -c FHSagnik.cpp -o FHSagnik.o
/mingw64/bin/g++  -std=gnu++11 -I"C:/PROGRA~1/R/R-4.1.0/include" -DNDEBUG  -I'C:/Users/sagni/Documents/R/win-library/4.1/Rcpp/include' -I'C:/Users/sagni/Documents/R/win-library/4.1/RcppArmadillo/include'     -fopenmp    -O2 -Wall  -mfpmath=sse -msse2 -mstackrealign  -c RcppExports.cpp -o RcppExports.o
/mingw64/bin/g++ -shared -s -static-libgcc -o SBHSdemo.dll tmp.def FHSagnik.o RcppExports.o -LC:/PROGRA~1/R/R-4.1.0/bin/x64 -lRlapack -LC:/PROGRA~1/R/R-4.1.0/bin/x64 -lRblas -lgfortran -lm -lquadmath -LC:/PROGRA~1/R/R-4.1.0/bin/x64 -lR
C:/RBuildTools/4.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: FHSagnik.o:FHSagnik.cpp:(.text+0x2ff): undefined reference to `omp_get_num_threads'
C:/RBuildTools/4.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: FHSagnik.o:FHSagnik.cpp:(.text+0x306): undefined reference to `omp_get_thread_num'
C:/RBuildTools/4.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: FHSagnik.o:FHSagnik.cpp:(.text+0xd43): undefined reference to `omp_in_parallel'
C:/RBuildTools/4.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: FHSagnik.o:FHSagnik.cpp:(.text+0xd58): undefined reference to `omp_get_max_threads'
C:/RBuildTools/4.0/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: FHSagnik.o:FHSagnik.cpp:(.text+0xfa1): undefined reference to `GOMP_parallel'
collect2.exe: error: ld returned 1 exit status
no DLL was created
ERROR: compilation failed for package 'SBHSdemo'

谁能告诉我该怎么做?

【问题讨论】:

    标签: c++ r windows gcc r-package


    【解决方案1】:

    根据Writing R Extensions,您不仅应该在PKG_CXXFLAGS 中包含SHLIB_OPENMP_CXXFLAGS,而且还应该在PKG_LIBS 中包含PKG_LIBS

    在 PKG_CFLAGS、PKG_CXXFLAGS 等以及 PKG_LIBS 中包含适当的宏(但对于 Fortran,请参见下文)。

    顺便说一句,当前的 Rcpp 不再需要将 Rcpp:::LdFlags() 添加到这些变量中。请参阅 https://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-package.pdf 中的第 2.7 节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      相关资源
      最近更新 更多