Fixing C++ compilation bugs for the macOS Catalina upgrade

I recently updated to macOS Catalina and encountered several issues with programs that use a C/C++ compiler. If you see any of these errors this post might be helpful for you:

/usr/local/Cellar/llvm/7.0.1/include/c++/v1/wchar.h:119:15: fatal error: 'wchar.h' file
not found
#include_next <wchar.h>
^~~~~~~~~
1 error generated.

Or any error indicating that a standard library couldn’t be found:

ld: library not found for -ldl
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)

The issue is that macOS Catalina doesn’t use the /usr/include and /usr/lib/ directories anymore for all C++ headers and libraries. A lot of projects rely on these directories to exist, can't find the files and then break. Instead they are under the xcode path and you need to tell the C/C++ compiler where to find these libraries now.

  1. Optionally, install a C++ compiler like clang / gcc through brew if one is missing.
  2. Install Xcode through the App store to get access to the developer command-line tools. This will install the C++ header files and libraries, albeit, in a different directory. They will be installed in /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk or a similar directory. To get the correct path for your system you can run the xcrun --show-sdk-path command.
  3. The C++ compiler needs to be told to look at this root path instead of /usr/include. This can be done by setting the CPLUS_INCLUDE_PATH env variable. It's important to also include LLVM's normal include path because this is where it should search first.
  • # adjust your llvm and CLT include paths to match your setup export CPLUS_INCLUDE_PATH=/usr/local/opt/llvm/include/c++/v1:/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include
  1. This should fix any fatal error: 'xxx.h' file not found errors.
  2. You might still run into linker errors like ld: library not found for -lxxx. The linker also needs to be told to look for libraries in the CommandLineTools/Xcode paths by setting the LIBRARY_PATH env variable.
  • export LIBRARY_PATH=$LIBRARY_PATH:/Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/lib
  1. Make sure to add these export statements to your .bash_rc, .zshrc, .bash_profile, or whatever shell you use, to make these adjusted environment variables available in all terminals.

Thanks a lot to this GitHub post for helping me figure out what’s wrong.

Written by

Full Stack Software Engineer #javascript #EOS. Into Recreational Math / CS 🤯 Just message me about anything, my mind is open.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store