何时需要使用标志-stdlib = libstdc ++?

使用gcc进行编译时,何时需要对编译器和链接器使用标志-std=c++11

编译器会自动使用libstdc ++吗?

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

Raymond Valdes asked 2020-06-20T20:12:04Z
3个解决方案
76 votes

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

  • clang++ -std=gnu++11 input.cxx -o a.out(通常是GNU编译器)
  • clang++ -std=gnu++11 input.cxx -o a.out

在Mavericks之前的OS X上:clang++ -std=gnu++11 input.cxx -o a.out实际上是clang++的别名,而苹果的旧版本libstdc ++是默认名称。 您可以通过传递-stdlib=libc++来使用libc ++(其中包括c ++ 11库支持)。如果要在此处编译c ++ 11代码,请使用以下方法之一:

  • clang++ -std=gnu++11 input.cxx -o a.out(c语,不是GNU编译器!)
  • clang++ -std=gnu++11 input.cxx -o a.out (clang, not GNU compiler!)
  • clang++ -std=gnu++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out

自Mavericks以来在OS X上:libc ++是默认设置。 您可以通过传递clang++ -std=gnu++11 input.cxx -o a.out来使用Apple的旧版本的libstdc ++(不包括c ++ 11库支持)

  • clang++ -std=gnu++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out
Bill Lynch answered 2020-06-20T20:15:50Z
17 votes

使用gcc进行编译时,何时需要对编译器和链接器使用标志-stdlib=libstdc++

简短答案:永不

更长的答案:-std=c++11是一个Clang标志,不适用于任何已发布的GCC版本。 在Mac OS X上,有时g++-L命令实际上是Clang而不是GCC的别名,并且Apple随附的libstdc ++版本是古老的(大约2008年),因此它当然不支持C ++ 11。 这意味着在OS X上使用Clang假装成为GCC时,可以使用-l选择Clang的新C ++ 11兼容库,也可以使用-stdlib=libstdc++选择C ++ 11之前的旧版本 属于博物馆的libstdc ++。 但是在GNU / Linux上,gccg++实际上不是GCC,所以-stdlib选项根本不起作用。

编译器会自动使用libstdc ++吗?

是的,除非您通过-std=c++11选项告诉它完全不使用任何标准库,否则GCC始终使用libstdc ++(在这种情况下,您要么需要避免使用任何标准库功能,要么使用g++-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功能。

Jonathan Wakely answered 2020-06-20T20:16:39Z
6 votes

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

Torsten Robitzki answered 2020-06-20T20:16:58Z
translate from https://stackoverflow.com:/questions/19774778/when-is-it-necessary-to-use-use-the-flag-stdlib-libstdc