I asked bluehost to install a modern version of gcc with C++11 support. They told me that only gcc4.3 was deemed stable.
So then I tried to compile gcc4.7 and gcc4.9 from scratch. This seemed promising but eventually I hit some apparent bug in the make routine of gcc giving me the error:
"cp: cannot stat `libgcc_s.so.1': No such file or directory"
Manually copying the file for make did not help.
So then I switched to trying to compile clang. This worked. I followed the instructions in this answer.
Namely, I added this to my .bashrc
export LD_LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.4.7/:$LD_LIBRARY_PATH
export CC=/usr/bin/gcc
export CXX=/usr/bin/g++
Then issued the following:
source .bashrc
wget http://llvm.org/releases/3.3/cfe-3.3.src.tar.gz
tar xzf llvm-3.3.src.tar.gz && cd llvm-3.3.src/tools/ && tar xzf ../../cfe-3.3.src.tar.gz
cd llvm-3.3.src
mv tools/cfe-3.3.src tools/clang
./configure --prefix=$HOME/llvm-3.3.src/llvm
make -j8
make install
Now to test it out, I created a file test.cpp
with this inside:
#include <iostream>
int main(int argc, char *argv[])
{
const auto & hello = []()
{
std::cout<<"Hello, world."<<std::endl;
};
hello();
}
Then I could try to compile with:
llvm-3.3.src/llvm/bin/clang++ -std=c++11 test.cpp -o test
But I get the error:
In file included from test.cpp:1:
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/iostream:40:
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/ostream:40:
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/ios:40:
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/exception:148:
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../include/c++/4.4.7/exception_ptr.h:143:13: error: unknown type name
'type_info'
const type_info*
^
1 error generated.
This seems to be a known bug with old "stable" versions of gcc's standard library. The fix is to add a class declaration before the #include <iostream>
:
#ifdef __clang__
class type_info;
#endif
#include <iostream>
int main(int argc, char *argv[])
{
const auto & hello = []()
{
std::cout<<"Hello, world."<<std::endl;
};
hello();
}
This compiles and runs.