rdevtoolsgslrtools

R not recognizing GSL library undefined references


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
> 

Solution

  • 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