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

Ray*_*des 48 c++ gcc std libstdc++ c++11

什么时候需要使用-stdlib=libstdc++gcc编译时使用编译器和链接器的标志?

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

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

Bil*_*nch 77

在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

在Mavericks之前的OS X上:g++实际上是别名clang++,Apple的旧版libstdc ++是默认的.您可以通过传递使用libc ++(包括c ++ 11库支持)-stdlib=libc++.如果要在此处编译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 ++是默认的.您可以通过传递使用Apple旧版本的libstdc ++(不包括c ++ 11库支持)-stdlib=libstdc++

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

  • @hithwen:我不认为你的问题与这个答案有关.我建议创建一个新问题来问这个问题. (6认同)
  • @ nn0p是的.它们是c ++标准库的两种不同实现.一个是gcc人,一个是llvm人. (5认同)
  • @raymondvaldes:这是正确的。Apple 拒绝分发包含 C++11 支持的较新版本的 libstdc++。 (2认同)
  • `libc++` 和 `libstdc++` 有什么区别?它们都是 C++ 标准运行时库吗? (2认同)

Jon*_*ely 17

什么时候需要使用-stdlib=libstdc++gcc编译时使用编译器和链接器的标志?

简短回答:从不

更长的答案:-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++用来选择libstdc ++之前的C++ 11古董版本属于博物馆.但是在GNU/Linux上gcc,g++真的是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++11then 编译,则可以在g++编译器中启用C++ 11功能,并在libstdc ++头文件中启用C++ 11功能.


Tor*_*zki 6

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

  • 确实.只是为了澄清:OP询问"何时使用gcc进行编译?".如果在一堆`.o`文件上运行`gcc`,那么我认为它假设它们只是*C*程序并且它不会链接到任何*C++*中.但是如果你使用`g ++`(或者你在`gcc`命令行上有任何cpp文件),那么我认为它会意识到应该包含stdc ++.但我对此并不太确定.这就是你说的吗? (2认同)