DEV Community

loading...
Cover image for Running C++17 on Mac M1

Running C++17 on Mac M1

Ayush Pattnaik
A beginner
・2 min read

Having problems using STL functions_ of C++14 or C++17?

Wrote a piece of code in C++ and encountered that STL functions are not supported by the default clang compiler on Mac?
For example, this piece of code:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n=gcd(2,3);
    cout<<n;
    return 0;
}
Enter fullscreen mode Exit fullscreen mode

Compiling the code with gnu or clang compilers and getting this error?

@User-MacBook-Air % clang++ test.cpp
test.cpp:5:11: error: use of undeclared identifier 'gcd'
    int n=gcd(2,3);
          ^
1 error generated.
Enter fullscreen mode Exit fullscreen mode

So what happened here?

Let's check our c++ version.

When you run clang --version, you will get something like this and would be pretty confused even if your clang/gnu is up-to-date but you still can't figure out your c++ version:

   Apple clang version 12.0.5 (clang-1205.0.22.9)
   Target: arm64-apple-darwin20.4.0
   Thread model: posix
   InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Enter fullscreen mode Exit fullscreen mode

This happens because

The gcd() function is a STL function from c++14 and above.

But by default, Clang builds C++ code according to the C++98 standard, with many C++11 features accepted as extensions.

What to do?

After going through many websites and resources, I was finally able to compile the correct methods to use c++17 on mac.
So in order to use STL functions of c++17 or c++14 or upper versions, you need to specify the version of C++ to be used which goes like this:

 -std=c++{version} {filename}.cpp
Enter fullscreen mode Exit fullscreen mode

appending the c++ version to -std option.

Example:

  • For clang compilers:

    
     clang++ --std=c++17 {filename}.cpp
    
    
  • For gnu compilers:

    
     g++ --std=gnu++17 {filename}.cpp
    
    
  • My Personal choice:

    
     c++ --std=gnu++17 {filename}.cpp
    
    

And that's it, you're done!

Also free feel to share other ways in the comments!!!

pride

Discussion (3)

Collapse
eljayadobe profile image
Eljay-Adobe

I got this error on my Mac:

$ clang++ -std=c++17 Ayush.cpp
Ayush.cpp:1:9: fatal error: 'bits/stdc++.h' file not found
#include<bits/stdc++.h>
        ^~~~~~~~~~~~~~~
1 error generated.
Enter fullscreen mode Exit fullscreen mode
Collapse
ayushpattnaik profile image
Ayush Pattnaik Author

Hi, checkout this solution. It worked for me
stackoverflow.com/a/40935471/13556971

Since, bits/stdc++ is a GNU GCC extension, whereas OSX uses the clang compiler.

You have to create bits directory inside /usr/local/include and then make a header file stdc++.h inside bits and paste the contents of this gist(gist.github.com/sachin-kmr/ee03a0d...) inside it. Then, it should compile as expected.

Since, /usr directory is hidden by default on Mac OSX.

  1. Open Finder.
  2. Click Go on menu bar then click Go to folder or Press Command+Shift+G directly.
  3. Enter the path /usr/local/include
  4. Now proceed as mentioned above. (UPDATE: For latest OS X you need to make folder include inside local and make bits folder inside include folder and then copy paste the code inside bits folder.)
Collapse
mkdcodes profile image
Abdullah Al Mukaddim

Nice!