R not recognizing GSL library undefined references

2019-08-27 02:13发布

问题:

I am installing a package from github in R (link here: https://github.com/aliceyiwang/mvabund), using devtools. I have installed Rtools, using the instructions for another package (here: https://cran.r-project.org/web/packages/dynr/vignettes/InstallationForUsers.pdf) and all the checks there indicate that GSL and RTools are installed properly.

I've set the Windows system environment variables LIB_GSL (as "C:/R/local323") and PATHS (as "C:/RTools/bin/", "C:/RTools/mingw_64/bin", "C:/R/R-3.5.1/bin")

I also run the following code in R before installing the package:

Sys.setenv("LIB_GSL" = "C:/R/local323")
Sys.setenv(BINPREF = "C:/Rtools/mingw_$(WIN)/bin/")
Sys.setenv(PATH = paste(Sys.getenv("PATH"), "C:/RTools/bin/",
                        "C:/RTools/mingw_64/bin", "C:/R/R-3.5.1/bin", sep = ";"))

Question:

When I run:

devtools::install_github("aliceyiwang/mvabund")

The code initiates well and starts installing the package. There comes a point, however, when this happens:

[...excluded very long list of undefined references like that below...]
summary.o:summary.cpp:(.text+0x194c): undefined reference to `gsl_vector_free'
    collect2.exe: error: ld returned 1 exit status
    no DLL was created
    ERROR: compilation failed for package 'mvabund'
    * removing 'C:/R/R-3.5.1/library/mvabund'
    In R CMD INSTALL
    Error in i.p(...) : 
      (converted from warning) installation of package ‘C:/Users/Joshua/AppData/Local/Temp/RtmpsPp5oY/file2154340c11f8/mvabund_4.0.tar.gz’ had non-zero exit status

My guess is that somewhere, some path to those functions has not been defined properly. What am I doing wrong?

My session info is

> sessionInfo()
R version 3.5.1 (2018-07-02)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_Australia.1252  LC_CTYPE=English_Australia.1252    LC_MONETARY=English_Australia.1252
[4] LC_NUMERIC=C                       LC_TIME=English_Australia.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] usethis_1.4.0  devtools_2.0.1

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.0        rstudioapi_0.8    magrittr_1.5      pkgload_1.0.2     R6_2.3.0          rlang_0.3.0.1    
 [7] tools_3.5.1       pkgbuild_1.0.2    sessioninfo_1.1.1 cli_1.0.1         withr_2.1.2       remotes_2.0.2    
[13] yaml_2.2.0        assertthat_0.2.0  digest_0.6.18     rprojroot_1.3-2   crayon_1.3.4      processx_3.2.1   
[19] callr_3.1.0       fs_1.2.6          ps_1.2.1          curl_3.2          testthat_2.0.1    memoise_1.1.0    
[25] glue_1.3.0        compiler_3.5.1    desc_1.2.0        backports_1.1.2   prettyunits_1.0.2
> 

回答1:

I'm going to include the entire answer to this problem, since it exists nowhere else in one spot, which fixes the errors in this question, and in this one: Installing R package from github returns non-zero exit status error; GSL and Rtools correctly installed

Before doing anything, make sure that R is not installed into a location with spaces in the file name. For example, we don't want C:\Program Files\R, because that has a space, and, as we all know, spaces let in the death bots, which destroy your installation.

Then install RTools (and, when you install RTools: no spaces in the file name... may take a while to install) and the GSL libraries following VERY CLOSELY the Windows instructions here:

https://cran.r-project.org/web/packages/dynr/vignettes/InstallationForUsers.pdf

(GSL libraries for R here: http://www.stats.ox.ac.uk/pub/Rtools/libs.html Rtools here - download the latest Frozen version (for now: Rtools34.exe): https://cran.r-project.org/bin/windows/Rtools/)

Then we download a zipped copy of the package from https://github.com/aliceyiwang/mvabund and unzip it in our working directory.

Now, using the above installation method, the GSL libraries are in two folders, one for each of the i386 and x64 architectures. Unfortunately, the Makevars.win file in the mvabund github version is not set up to distinguish between the architectures in that setup, as it has only one path for PKG_LIBS.

So, clear the Makevars.win file and replace it with:

## This assumes that the LIB_GSL variable points to working GSL libraries
CXX_STD = CXX11
ARCH=x64
ifeq "$(WIN)" "64"
ARCH= i386
else
ARCH= x64
endif
PKG_CPPFLAGS = -I$(LIB_GSL)/include -I. -I../inst/include
PKG_LIBS=-L"$(LIB_GSL)\lib"$(R_ARCH_BIN) -lgsl -lgslcblas 

Then we run the following code. Replace the file paths with your file paths.

Sys.setenv("LIB_GSL" = "C:/R/local323") # Replace file path here; this is the GSL library location, same as you specified for LIB_GSL in the windows environment 
Sys.setenv(BINPREF = "C:/Rtools/mingw_$(WIN)/bin/") # Replace file path here
Sys.setenv(PATH = paste(Sys.getenv("PATH"), "C:/RTools/bin/", sep = ";")) # Replace file path here
Sys.setenv("PKG_LIBS"="-L$(LIB_GSL)/lib/$(R_ARCH_BIN) -lgsl -lgslcblas")
Sys.setenv("PKG_CPPFLAGS"="-I$(LIB_GSL)/include -I. -I../inst/include")

# this assumes you have unzipped the mvabund download in your working directory
file.rename("mvabund-master", "mvabund")
shell("R CMD build mvabund")
install.packages("mvabund_4.0.tar.gz", repos = NULL) #may need to replace file name
library("mvabund")

Let's run an analysis, then:

abund <- mvabund(dataset[,8:39]) #community matrix section of spreadsheet
treatment <- as.character(dataset$Treatment) #treatment variable
## pairwise comparison 
manyglm(abund ~ treatment) -> msolglm
anova(msolglm, pairwise.comp = treatment, nBoot = 9) #pairwise comparisons make it run longer