Apple - Why is /usr/include missing? I have Xcode and Command Line Tools installed (Mojave)
You have to run another step after installing the command line tools:
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
Why? Apple have introduced a new build tool dance - system includes are now only kept under a specific SDK's path with Xcode 10 onwards:
The Command Line Tools package installs the macOS system headers inside the macOS SDK. Software that compiles with the installed tools will search for headers within the macOS SDK [...] provided by either Xcode [...] or the Command Line Tools [...] depending on which is selected using xcode-select.
[...]
The command line tools will search the SDK for system headers by default. However, some software may fail to build correctly against the SDK and require macOS headers to be installed in the base system under
/usr/include
[emphasis added]. If you are the maintainer of such software, we encourage you to update your project to work with the SDK or file a bug report for issues that are preventing you from doing so. As a workaround, an extra package is provided which will install the headers to the base system. In a future release, this package will no longer be provided. You can find this package at:/Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
To make sure that you're using the intended version of the command line tools, run
xcode-select -s <path to Xcode>
orxcode select -s /Library/Developer/CommandLineTools
after installing.
The "why" is because Apple has deprecated having a /usr/include distinct from the SDK. You shouldn't rely on having it going forward.
The compilers know already to find their includes inside the SDK, so there's no real need for the /usr/include directory any more. You can find the SDK's install directory for the include files using xcrun --show-sdk-path
Add the -isysroot
flag to your compile flags to automatically include the appropriate SDK header directory and avoid the need for the /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg
package that will "in a future release, ... no longer be provided."
Examples:
-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk
or
-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk
You can use xcrun --show-sdk-path
to find the default SDK path.
You can also use the Xcode or CommandLineTools installed /usr/bin/ versions of clang, clang++, cc, c++, gcc, g++ which are shims calling xcrun
to invoke the correct tool with the currect SDK and include directories.
This defaults to CommandLineTools if you have that installed.
You can switch the behavior to use Xcode by:
$ sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
or switch back:
$ sudo xcode-select -s /Library/Developer