什么时候需要使用标志-stdlib = libstdc ++?

时间:2013-11-04 18:43:52

标签: c++ gcc c++11 std libstdc++

在使用gcc编译时,何时需要使用标志-stdlib=libstdc++作为编译器和链接器?

编译器是否自动使用libstdc ++?

我在Ubuntu 13.10上使用gcc4.8.2,我想使用c ++ 11标准。我已将-std=c++11传递给编译器。

3 个答案:

答案 0 :(得分:72)

在Linux上:一般来说,所有常用的Linux发行版默认使用libstdc ++,所有现代版本的GCC都附带一个支持C ++ 11的libstdc ++。如果要在此处编译c ++ 11代码,请使用以下方法之一:

  • g++ -std=c++11 input.cxx -o a.out
  • g++ -std=gnu++11 input.cxx -o a.out

在小牛队之前的OS X上g++实际上是clang++的别名,Apple的旧版libstdc ++是默认的。您可以通过传递-stdlib=libc++来使用libc ++(包括c ++ 11库支持)。如果要在此处编译c ++ 11代码,请使用以下方法之一:

  • g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out

自Mavericks以来在OS X上:libc ++是默认值。您可以通过传递-stdlib=libstdc++

来使用Apple的旧版libstdc ++(不包括c ++ 11库支持)
  • clang++ -std=c++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out

答案 1 :(得分:13)

  

在使用gcc编译时,何时需要使用标志-stdlib=libstdc++作为编译器和链接器?

简短回答:从不

更长的回答:-stdlib是一个Clang标志,不适用于任何版本的GCC。在Mac OS X上,有时gccg++命令实际上是Clang GCC的别名,而Apple发布的libstdc ++版本古代 (大约2008年)当然它不支持C ++ 11。这意味着在OS X上使用Clang-pretending-to-GCC时,您可以使用-stdlib=libc++选择Clang的新C ++ 11兼容库,或者您可以使用-stdlib=libstdc++来选择pre-C ++ 11古董版libstdc ++,属于博物馆。但是在GNU / Linux上gccg++实际上是GCC而不是Clang,因此-stdlib选项根本不起作用。

  

编译器是否自动使用libstdc ++?

是的,GCC总是使用libstdc ++,除非你告诉它使用没有标准库和-nostdlib选项(在这种情况下你需要避免使用任何标准库功能,或使用-I-L-l标记将其指向另一组标题和库文件。)

  

我在Ubuntu 13.10上使用gcc4.8.2,我想使用c ++ 11标准。我已将-std=c++11传递给编译器。

您不需要做任何其他事情。 GCC自带了C ++标准库(libstdc ++)的实现,它与GCC本身一起开发和测试,因此GCC的版本和libstdc ++的版本是100%兼容的。如果使用-std=c++11进行编译,那么将启用g++编译器中的C ++ 11功能以及libstdc ++头文件中的C ++ 11功能。

答案 2 :(得分:6)

如果使用g ++前端,编译器会自动使用libstdc ++,而不是gcc前端。