Dealing with Catalina II

Still get Error in throw_exception() : this is the expected behavior. I’ll rerun the example now.

I got the same

Chain 1: Iteration: 1 / 2000 [ 0%] (Warmup)
[1] “Error in sampler$call_sampler(args_list[[i]]) : "
[2] " c++ exception (unknown reason)”
error occurred during calling the sampler; sampling not done

Here’s the verbose output:

Compilation argument:
/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB file91bf424c6003.cpp 2> file91bf424c6003.cpp.err.txt
/usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I"/Users/torkarr/Library/R/3.6/library/Rcpp/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/unsupported" -I"/Users/torkarr/Library/R/3.6/library/BH/include" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/src/" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/" -I"/Users/torkarr/Library/R/3.6/library/rstan/include" -DEIGEN_NO_DEBUG -DBOOST_DISABLE_ASSERTS -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include -fPIC -Wall -g -O2 -c file91bf424c6003.cpp -o file91bf424c6003.o
/usr/local/clang7/bin/clang++ -L/Library/Frameworks/R.framework/Resources/lib/libc++.1.dylib -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o file91bf424c6003.so file91bf424c6003.o -L/Users/torkarr/Library/R/3.6/library/StanHeaders/lib/ -lStanHeaders -F/Library/Frameworks/R.framework/… -framework R -Wl,-framework -Wl,CoreFoundation

And

dlls <- getLoadedDLLs()
paths <- vapply(dlls, `[[`, "path", FUN.VALUE = character(1))
invisible(lapply(paths, function(path) {
  
  if (!file.exists(path))
    return(FALSE)
  
  output <- system(paste("otool -L", shQuote(path), "| grep libc++ || true"),
                   intern = TRUE)
  if (length(output) == 0)
    return(FALSE)
  
  writeLines(paste0(path, ":"))
  writeLines(output)
  
}))

still has /usr/lib/libc++.1.dylib at the end?

/Users/torkarr/Library/R/3.6/library/Rcpp/libs/Rcpp.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.6.0)
/Users/torkarr/Library/R/3.6/library/scales/libs/scales.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/tidyselect/libs/tidyselect.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/dplyr/libs/dplyr.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/rstan/libs/rstan.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//RtmpQ45ZaX/file91bf424c6003.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)

I don’t know how that is possible. We’ll need additional Mac expertise.

In the meantime, try changing

-L$(R_HOME)/lib/libc++.1.dylib

to

-L/usr/local/clang7/lib

in ~/.R/Makevars.

Now it sampled correctly…
Your DLL code says this:

/Users/torkarr/Library/R/3.6/library/Rcpp/libs/Rcpp.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.6.0)
/Users/torkarr/Library/R/3.6/library/scales/libs/scales.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/tidyselect/libs/tidyselect.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/dplyr/libs/dplyr.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/rstan/libs/rstan.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//RtmpDpq1C9/file9780549a963b.so:
/usr/local/clang7/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)

And compilation arguments are:

Compilation argument:
/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB file9780549a963b.cpp 2> file9780549a963b.cpp.err.txt
/usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I"/Users/torkarr/Library/R/3.6/library/Rcpp/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/unsupported" -I"/Users/torkarr/Library/R/3.6/library/BH/include" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/src/" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/" -I"/Users/torkarr/Library/R/3.6/library/rstan/include" -DEIGEN_NO_DEBUG -DBOOST_DISABLE_ASSERTS -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include -fPIC -Wall -g -O2 -c file9780549a963b.cpp -o file9780549a963b.o
/usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o file9780549a963b.so file9780549a963b.o -L/Users/torkarr/Library/R/3.6/library/StanHeaders/lib/ -lStanHeaders -F/Library/Frameworks/R.framework/… -framework R -Wl,-framework -Wl,CoreFoundation

I need to fetch my kids now so will check later this evening (Swedish time).

Is /Library/Frameworks/R.framework/Resources/lib/libc++1.dylib a symlink to /usr/lib/libc++.1.dylib in Sweden?

Not sure if it helps at all, but in case any linux-based devs want to get hands-on with Catalina, I just found these instructions for setting it up as a VM (inc. auto-downloading the OS ISO): https://github.com/foxlet/macOS-Simple-KVM/blob/master/README.md

1 Like

Well, in Sweden there’s no libc++1.dylib ;) But I have a libc++.1.dylib and it’s not a link:

% ls -lsa libc++.1.dylib
1656 -rwxrwxr-x 1 root admin 845100 Jul 6 04:12 libc++.1.dylib

OK. Try agin with

-L$(R_HOME)/lib

in ~/.R/Makevars instead of

-L/usr/local/clang7/lib

Got an unknown reason during sampling again. Previously it sampled nicely with -L/usr/local/clang7/lib

Output below:

Compilation argument:
/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB fileac4a36d3023f.cpp 2> fileac4a36d3023f.cpp.err.txt
/usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I"/Users/torkarr/Library/R/3.6/library/Rcpp/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/unsupported" -I"/Users/torkarr/Library/R/3.6/library/BH/include" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/src/" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/" -I"/Users/torkarr/Library/R/3.6/library/rstan/include" -DEIGEN_NO_DEBUG -DBOOST_DISABLE_ASSERTS -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include -fPIC -Wall -g -O2 -c fileac4a36d3023f.cpp -o fileac4a36d3023f.o
/usr/local/clang7/bin/clang++ -L/Library/Frameworks/R.framework/Resources/lib -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o fileac4a36d3023f.so fileac4a36d3023f.o -L/Users/torkarr/Library/R/3.6/library/StanHeaders/lib/ -lStanHeaders -F/Library/Frameworks/R.framework/… -framework R -Wl,-framework -Wl,CoreFoundation

and,

/Users/torkarr/Library/R/3.6/library/Rcpp/libs/Rcpp.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.6.0)
/Users/torkarr/Library/R/3.6/library/scales/libs/scales.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/tidyselect/libs/tidyselect.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/dplyr/libs/dplyr.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/rstan/libs/rstan.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//Rtmp6fAMsg/fileac4a36d3023f.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)

Can you add a -lc++ at the end of

SHLIB_CXX14LD = /usr/local/clang7/bin/clang++ -L$(R_HOME)/lib/"

in ~/.R/Makevars .

Same error with the sampling.

Compilation argument:
/Library/Frameworks/R.framework/Resources/bin/R CMD SHLIB fileb7c99ed272e.cpp 2> fileb7c99ed272e.cpp.err.txt
/usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1 -std=gnu++14 -I"/Library/Frameworks/R.framework/Resources/include" -DNDEBUG -I"/Users/torkarr/Library/R/3.6/library/Rcpp/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/" -I"/Users/torkarr/Library/R/3.6/library/RcppEigen/include/unsupported" -I"/Users/torkarr/Library/R/3.6/library/BH/include" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/src/" -I"/Users/torkarr/Library/R/3.6/library/StanHeaders/include/" -I"/Users/torkarr/Library/R/3.6/library/rstan/include" -DEIGEN_NO_DEBUG -DBOOST_DISABLE_ASSERTS -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk -I/usr/local/include -fPIC -Wall -g -O2 -c fileb7c99ed272e.cpp -o fileb7c99ed272e.o
/usr/local/clang7/bin/clang++ -L/Library/Frameworks/R.framework/Resources/lib -lc++ -dynamiclib -Wl,-headerpad_max_install_names -undefined dynamic_lookup -single_module -multiply_defined suppress -L/Library/Frameworks/R.framework/Resources/lib -L/usr/local/lib -o fileb7c99ed272e.so fileb7c99ed272e.o -L/Users/torkarr/Library/R/3.6/library/StanHeaders/lib/ -lStanHeaders -F/Library/Frameworks/R.framework/… -framework R -Wl,-framework -Wl,CoreFoundation

/Users/torkarr/Library/R/3.6/library/Rcpp/libs/Rcpp.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.6.0)
/Users/torkarr/Library/R/3.6/library/scales/libs/scales.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/tidyselect/libs/tidyselect.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/dplyr/libs/dplyr.so:
/Library/Frameworks/R.framework/Versions/3.6/Resources/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/Users/torkarr/Library/R/3.6/library/rstan/libs/rstan.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//RtmpaaeUD3/fileb7c99ed272e.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)

And

example(cxxfunction, package = "inline", run.dontrun = TRUE)

links the DLLs to /usr/lib/libc++.1.dylib or to /Library/Frameworks/R.framework/Resources/lib/libc++.1.dylib?

I ran example() and then your DLL function

/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//RtmpPbjB1G/filec6655bfafc7a.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)
/Users/torkarr/Library/R/3.6/library/Rcpp/libs/Rcpp.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.6.0)
/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//RtmpPbjB1G/filec6653ad5dcc3.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)
/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//RtmpPbjB1G/filec6652e90a462.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)
/Users/torkarr/Library/R/3.6/library/RcppArmadillo/libs/RcppArmadillo.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.6.0)
/var/folders/5p/dlcj_kd94bx83r83k_d77j54pspdk5/T//RtmpPbjB1G/filec6651a1835d0.so:
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)

OK. I can live with that. I changed the OP to look in /usr/local/clang7/lib rather than $(R_HOME)/lib.

1 Like

@bgoodri Are you on Stan’s Slack? I could pop in there.

I’m fine with adding a modification to ~/.R/Makevars that contains:

CXX14 = /usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1
SHLIB_CXX14LD = /usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib/

Let me know your preference.

I haven’t joined Stan’s slack because I’m afraid I would never be able to leave, but if you want to talk off Discourse, I’m happy to do that.

Adding

CXX14 = /usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1
SHLIB_CXX14LD = /usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib/

seems to work for Stan, but I’m not sure it is the ultimate solution. First, people using Rcpp::sourceCpp or inline::cxxfunction on Catalina will still get errors from exceptions by default using C++11 or C++98. You could make the broader change

CXX = /usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1
SHLIB_CXXLD = /usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib/
CXX11 = /usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1
SHLIB_CXX11LD = /usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib/
CXX14 = /usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1
SHLIB_CXX14LD = /usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib/
CXX17 = /usr/local/clang7/bin/clang++ -stdlib=libc++ -nostdinc++ -I/usr/local/clang7/include/c++/v1
SHLIB_CXX17LD = /usr/local/clang7/bin/clang++ -L/usr/local/clang7/lib/

but I don’t know if that would adversely affect other packages that are implicitly relying on XCode to link. Stan, unlike almost all packages, enforces C++14 so only doing it for CXX14 and SHLIB_CXX14LD is unlikely to affect too many other packages.

More broadly, I don’t know why SHLIB_CXX{98,11,14,17}LD on a Mac differs from the corresponding CXX{98,11,14,17}. On Linux, they seem to be the same. But I stumbled into this workaround by observing on a friend’s Mac that (in a shell)

`R CMD config SHLIB_CXX14LD` --version

was clang++ from XCode, which was the reason for the conflict between LLVM-clang++ compiled code and XCode-libc++ . So, maybe R is just misconfigured for Macs?

I also don’t know why -L/usr/local/clang7/lib works for us but -L$(R_HOME)/lib does not work for us. The latter works for Rcpp::sourceCpp but the former works for inline::cxxfunction, which is what Stan calls. So, maybe the $(R_HOME)/lib/libc++.1.dylib that comes with the R binary for Mac was compiled by XCode or is wrong for some other weird reason.

BTW, I don’t think you have to upgrade to Catalina yourself to test whether there are issues with any of the above. You just need to compile / link some C++ code and see what libc++.1.dylib is picked up with @kevinushey’s test:

dlls <- getLoadedDLLs()
paths <- vapply(dlls, `[[`, "path", FUN.VALUE = character(1))
invisible(lapply(paths, function(path) {
  
  if (!file.exists(path))
    return(FALSE)
  
  output <- system(paste("otool -L", shQuote(path), "| grep libc++ || true"),
                   intern = TRUE)
  if (length(output) == 0)
    return(FALSE)
  
  writeLines(paste0(path, ":"))
  writeLines(output)
  
}))

Probably should of chatted off-discourse at the start, but in the future, feel free to ping me via e-mail (@illinois.edu) if something arises.

I think so. We might want to ping Simon. Though, he’s a bit busy. But, I’d like to avoid a repeat of this when R 4.0.0 is released in April. The toolchain is slated to move to clang8 then.

I’ll investigate it a bit more.

I’m wondering if the reason for this is because $(R_HOME) isn’t set without enclosing the statement with backticks, e.g. :

SHLIB_CXX14LD = /usr/local/clang7/bin/clang++ -L`$(R_HOME)/lib/libc++.1.dylib`
1 Like

@torkar got $(R_HOME) to expand to the correct path without the backticks but that was somehow insufficient to get inline::cxxfunction to not link against /usr/lib/libc++.1.dylib which continues to be a mystery to me.

Anyway, I agree it would be good to get someone from CRAN to weigh in. I would be happy to help further, but all I know is collected at