Following up library dependency in R package compilation

Hello there.

I had not anticipated to encounter this problem again so soon, but I did when I was installing yet another package on my own laptop.

ld: warning: directory not found for option '-L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin15/6.1.0'
ld: warning: directory not found for option '-L/usr/local/gfortran/lib'
ld: library not found for -lgfortran
clang: error: linker command failed with exit code 1 (use -v to see invocation)

This prompted to think again about the issues I grunted about the other day. Back then, I could not install some packages because R can not locate libgfortran during package compilation, and my work-around was install via Conda, which seems to provide compiled binary version.

What tells R where to find compilers and libraries?

I (belatedly) find out R have a configuration file in /Library/Frameworks/R.framework/Resources/etc/Makeconf, and sometimes when Conda/Homebrew or other package managers install new compilers or libraries, it might not get updated.

This is exactly the source of my problem. It is suggested a user could create a Makevars file in the same directory, which would then be read with a higher priority, but it somehow does not work on my laptop.

As a result, I commented out the original setting in Makeconf and installed gcc from homebrew. Now, I have gfortran incorporated into the homebrew version of gcc, which could also replace clang from Xcode to support OpenMP.

The changes in my Makeconf file as a result is:

# Use Homebrew gcc for OpenMP support
CC = gcc-8
# CC = clang # Original setting
...
# Use Homebrew gcc for OpenMP support
CXX = g++-8
# CXX = clang++ # Original setting
...
# Ask R to find the Homebrew copy of gcc
FLIBS = -L/usr/local/lib/gcc/8/gcc/x86_64-apple-darwin17.5.0/8.1.0 -L/usr/local/lib/gcc/8 -lgfortran -lquadmath -lm
# The original one
# FLIBS =  -L/usr/local/gfortran/lib/gcc/x86_64-apple-darwin15/6.1.0 -L/usr/local/gfortran/lib -lgfortran -lquadmath -lm

This fixed my problem of R package compilation.

# SessionInfo at the time of writing

> sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.4

Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

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

loaded via a namespace (and not attached):
[1] compiler_3.4.4 tools_3.4.4    yaml_2.1.19
Avatar
Yen-Chung Chen
PhD Student

Yen is a graduate student interested in developmental biology, neurobiology and bioinformatics.

Related