5

I'd like to keep my OS, R, and R packages up to date. I unknowingly treaded into deep water by upgrading to OSX 10.15.6 and upgrading to R 4.0.2. Currently, Rcpp is failing to compile c++ code, which I believe is causing the CRAN installation for certain packages to fail (e.g. glmmTMB), and is also causing installations from source to fail. I'll describe what I've done and hopefully someone can elucidate a solution.


In a rough order, here's what I've done:

  1. Installed OSX 10.15.6

I don't remember the date but it was fairly recent. I don't know how closely this is related to the problem, I was having issues installing other R packages (e.g. rstan) that needed Rcpp prior to this.

  1. Ran into an issue trying to run some old glmmTMB models

The exact error was identical to this issue. I followed the various solutions on that thread to no avail. Perhaps the most frustrating was when attempting to install from source, which then failed to compile some c++.

This wasn't the first time I had seen similar errors. Something similar happened when I tried installing rstan, so I asked for some help on their repo under a similar issue. Nothing helped.

This was on R 3.6, so I thought maybe it'd be worth updating R and glmmTMB. Before doing this I wanted to install Xcode, as opposed to just the Command Line Developer Tools, in hopes that the installation would ensure I'd have everything clang- and c++ compiler-related squared away.

  1. Installed Xcode to help set a baseline c++ environment

Relatively painless, am able to build and compile fairly simple c++ projects.

  1. Installed R 4.0.2

From the r-project site, I installed R-4.0.2.pkg without issues and with the default install settings. According to the R project Tools site, I was reassured in installing Xcode and continued on to install the GNU Fortran 8.2 installer.

  1. Followed @coatless's guide to installing Rcpp

Discovered this guide and followed each step, except for those related to xcode-select.

  1. Testing Rcpp and RcppArmadillo from the guide

One of the last steps is to test the installation with a simple helloworld.cpp test. This fails with this error (abridged for clarity):

> Rcpp::sourceCpp("~/Documents/BergenLab/nlp_cancer_metaphor/helloworld.cpp")
In file included from helloworld.cpp:1:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/RcppArmadillo/include/RcppArmadillo.h:31:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/RcppArmadillo/include/RcppArmadilloForward.h:26:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/include/RcppCommon.h:29:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/include/Rcpp/r/headers.h:67:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/include/Rcpp/platform/compiler.h:100:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:317:9: error: no member named 'signbit' in the global namespace
using ::signbit;
      ~~^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
20 errors generated.
make: *** [helloworld.o] Error 1
clang++ -mmacosx-version-min=10.13 -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I../inst/include   -I"/Library/Frameworks/R.framework/Versions/4.0/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/4.0/Resources/library/RcppArmadillo/include" -I"/Users/alex/Documents/BergenLab/nlp_cancer_metaphor" -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include   -fPIC  -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -c helloworld.cpp -o helloworld.o
Error in Rcpp::sourceCpp("~/Documents/BergenLab/nlp_cancer_metaphor/helloworld.cpp") : 
  Error 1 occurred building shared library.
  1. Tried to debug Rcpp to no avail

Found some somewhat related reports, such as Packages cannot build from source due to math.h not found, Rcpp doesn't under macOS, math.h not found, Source Cpp file failed due to math.h not found, and Cannot compile R packages with c++ code after updating to macOS Catalina.

None of the solutions in these answers have helped at all. The only solution which gave me feedback was using installer to install macOS_SDK_headers_for_macOS_10.14.pkg which subsequently gave me installer: Error - the package path specified was invalid (not sure how what the implications of this are).

  1. Installing glmmTMB from source fails

One of the solutions from an above glmmTMB issue recommends installing from source. Here is the error on my attempt:

* installing *source* package ‘glmmTMB’ ...
** package ‘glmmTMB’ successfully unpacked and MD5 sums checked
** using staged installation
** libs
clang++ -mmacosx-version-min=10.13 -std=gnu++11 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG  -I'/Library/Frameworks/R.framework/Versions/4.0/Resources/library/TMB/include' -I'/Library/Frameworks/R.framework/Versions/4.0/Resources/library/RcppEigen/include' -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include   -fPIC  -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -c glmmTMB.cpp -o glmmTMB.o
In file included from glmmTMB.cpp:1:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/TMB/include/TMB.hpp:53:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/RcppEigen/include/Eigen/Dense:1:
In file included from /Library/Frameworks/R.framework/Versions/4.0/Resources/library/RcppEigen/include/Eigen/Core:96:
In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/complex:245:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/cmath:317:9: error: no member named 'signbit' in the global namespace
using ::signbit;
      ~~^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
13 warnings and 20 errors generated.
make: *** [glmmTMB.o] Error 1
ERROR: compilation failed for package ‘glmmTMB’
* removing ‘/Library/Frameworks/R.framework/Versions/4.0/Resources/library/glmmTMB’
* restoring previous ‘/Library/Frameworks/R.framework/Versions/4.0/Resources/library/glmmTMB’
Warning in install.packages :
  installation of package ‘glmmTMB’ had non-zero exit status

Overall, I'm still unable to run my glmmTMB models (and I presume unable to build rstan as well). Something with my c++ compiler must be off but I'm a c++ beginner and am unsure how to interpret the errors I'm getting. Something's wrong with the header files, but it seems perhaps like it's not due to math.h being missing (like most other posts). It should go without saying but any help would be greatly appreciated!


Edit 1

I've tried to narrow down the error and thus followed each step from @coatless's guide, exactly as listed there and according to the R installation documentation. My exact steps:

  1. Removed gfortran 8.2. Removed ~/.Renviron and ~/.R/Makevars. Unlinked both of these files from Rstudio with unlink().

  2. Ran xcode-select --install, which returned with "use "Software Update" to install updates." Accordingly, softwareupdate --list estimated that nothing needed updating. Regardless, I uninstalled Command Line Tools with sudo rm -rf /Library/Developer/CommandLineTools and installed the Command Line Tools with xcode-select —install. Up to this point everything is working as expected. Small c++ programs are being compiled without issue by both gcc and clang++.

  3. According to the R manual, from https://mac.r-project.org/libs-4/, I installed pcre2-10.34-darwin.17-x86_64.tar.gz, xz-5.2.4-darwin.17-x86_64.tar.gz , and readline-5.2.14-darwin.17-x86_64.tar.gz to /usr/local. No big issues here, although I'm not really sure how to verify that these work as expected.

  4. Restarted an R session in RStudio.

  5. Installed Rcpp and RcppArmadillo with install.packages(c(‘Rcpp’, ‘RcppArmadillo’))

  6. Created a ~/helloworld.cpp with the code from Slide 15 mentioned in the comments.

  7. Running Rcpp::sourceCpp("~/helloworld.cpp") fails with the exact error as mentioned in the body of the post. Similarly evalCpp() fails with a similar error.

Alex L
  • 470
  • 6
  • 15
  • 1
    This appears to happen on each macOS update, and each time the recommended course action appears to (re-)install some components as [generally outlined on James's site](https://thecoatlessprofessor.com/programming/cpp/r-compiler-tools-for-rcpp-on-macos/) -- but I don't know any details as I make my life easier by just being on Linux where things just work, even when we upgrade ... – Dirk Eddelbuettel Sep 12 '20 at 23:38
  • Also, you do need to decompose. I am not sure why you said "followed @coatless guide for all steps but one". These are generally not optional. After installing Rcpp, check that Rcpp works. The RcppArmadillo. Both `glmmTMB` and `rstan` are more complicated but cannot work is the foundation is borked. One. Step. At. A. Time. And test test test. – Dirk Eddelbuettel Sep 12 '20 at 23:57
  • Hi @DirkEddelbuettel, I appreciate the response, even if it's a little back-handed. This is my first time working with Rcpp and its ecosystem so lets work together here: just failed to compile with Rcpp your test code found at https://dirk.eddelbuettel.com/papers/rcpp_rfinance_may2017.pdf on slide 15. `cppFunction()` and `cppEval()` also fail. I'm seeing the (seemingly) same errors as under my point (6). I'll go back to James' guide and report back. – Alex L Sep 13 '20 at 01:46
  • Yes! It is easy to get swept up in the complexity. The simplest test remains `Rcpp::evalCpp("2+2")`. If that doesn't come back with 4 you have an issue. (Sadly RcppArmadillo is next and it has a more macOS specific requirement for you I know less about as a Linux user.) Layering really is key. Decompose. Check each part. – Dirk Eddelbuettel Sep 13 '20 at 02:55
  • Can we remove the rstan tag as this isn't stan or rstan specific? – ssp3nc3r Sep 13 '20 at 17:49
  • Sure, but then we can also remove Rcpp. It is, at the very bottom of it, "merely" an inconvenience for macOS users. Our packages have nothing to do with this per se, but simply come up in "doh it doesn't work" as being able to compile is a requirement. – Dirk Eddelbuettel Sep 13 '20 at 17:59
  • ssp3nc3r yes! Sorry, I wasn't sure the scope of the issue going into it. @DirkEddelbuettel Perhaps it's not an Rcpp issue. I admit I don't know how to verify that clang++ (or any compiler) is working. It seems like some Xcode header file is missing/not being linked given the numerous "no template named" errors. I've retagged the post and hopefully someone in the OSX/clang domain can chime in. Thank you. – Alex L Sep 13 '20 at 22:43
  • Purely an R issue AFAIK. Try the r-sig-mac list. – Dirk Eddelbuettel Sep 13 '20 at 23:07
  • Thanks @DirkEddelbuettel for your input – solved the issue: wasn't a fault with `Rcpp` but rather, I think, the ordering of the header file includes. – Alex L Sep 14 '20 at 16:56
  • Yes, that has happened before and remains a tricky problem. – Dirk Eddelbuettel Sep 14 '20 at 17:07

1 Answers1

2

After a bit of digging, the issue turned out to be neither glmmTMB, Rcpp, or really anything high-level. From what I understand: When R uses Rcpp to compile c++ code, a certain set of arguments are passed to the system c++ compiler. In my case this compiler was clang++ since I had just installed Xcode. The c++ compiler relies on a set of c++ header files to be included in exactly the right order. Seemed like the order of mine were incorrect, thus causing a slew of errors regarding "missing template definitions."

I looked into changing the order of the includes but couldn't find any straightforward solution. I knew that Rcpp was calling a very specific array of arguments to clang++, so I looked into how that might elucidate an answer. I looked into the manuals for clang++ to figure out what -isysroot and -I meant and felt like they might play a part in reconfiguring how the system header files were being compiled. From one of the threads below I discovered the $(R RHOME)/etc/Makeconf Makefile and proceeded to change the directory of the OSX SDK from what I believe was the Command Line Tools path to the Xcode path. This seemed to solve the issue.

Some threads I used to find this solution: Cannot compile R packages with c++ code after updating to macOS Catalina and Catalina C++: Using <cmath> headers yield error: no member named 'signbit' in the global namespace.

What worked for me:

  1. Note the current header file search

From clang++ -Wp,-v -E -:

#include <...> search starts here:
 /usr/local/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.3/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks (framework directory)
  1. Note the OSX SDK path

From xcrun --show-sdk-path:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
  1. Modify the R configuration

With vim $(R RHOME)/etc/Makeconf, changed the CPPFLAGS flag to:

CPPFLAGS = -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -I/usr/local/include

Notice how this SDK directory is what was found in step 2. This apparently cleans up the location and order of the SDK header file includes.

  1. Reinstall glmmTMB from source

I was still seeing a FreeADFunObject error when trying to fit a glmmTMB model, so I went back to this GH thread and followed the first suggestion: to reinstall from source. This wasn't working before since I needed a properly set up c++ configuration, which I fixed in the last two steps.

Hence, install.packages("glmmTMB", type="source") installed without issue and I can now build and fit glmmTMB models.


For posterity's sake:

> sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.6

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/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
Alex L
  • 470
  • 6
  • 15
  • 1
    Using Rcpp in active voice is not quite correct. It is R that does all the calling. We just supply some arguments, mostly include directories. – Dirk Eddelbuettel Sep 14 '20 at 17:08