When I run command clang++ -Wall -g -std=c++11 main.cpp
in terminal the file gets compiled successfully.
% clang++ -Wall -g -std=c++11 main.cpp
% ./a.out
s
s
%
But when I try to do the same thing using MakeFile. I get following error.
I don’t know why error occurred when same command is executed in both case.
% make main
c++ main.cpp -o main
main.cpp:17:5: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions]
auto s = std::async(get);
^
main.cpp:17:19: error: no member named 'async' in namespace 'std'
auto s = std::async(get);
~~~~~^
1 warning and 1 error generated.
make: *** [main] Error 1
My MakeFile content:
main: main.cpp
clang++ -Wall -g -std=c++11 main.cpp
My main.cpp content:
#include<iostream>
#include<thread>
#include<string>
#include<future>
std::string get() {
std::string s;
std::getline(std::cin, s);
return s;
}
void put(std::string s) {
std::cout << s << std::endl;
}
int main(int argc, char **argv){
auto s = std::async(get);
std::thread t(put, s.get());
t.join();
return 0;
}
>Solution :
As you can see when you run make
, the compilation command invocation is missing the -std=c++11
option that you use when you’re compiling your code manually.
You can use
CXXFLAGS=-std=c++11
to have make
automatically add this option when building .o
files from .cpp
files.
You can also provide the -g
and -Wall
options the same way.