在使用gcc编译时,何时需要使用标志-stdlib=libstdc++
来指定链接器?
编译器是否会自动使用libstdc++?
我正在Ubuntu 13.10上使用gcc4.8.2,并希望使用C++11标准。我已经向编译器传递了-std=c++11
参数。
在Linux上:通常情况下,所有常见的Linux发行版都会默认使用libstdc++,而所有现代版本的GCC都带有支持C++11的libstdc++。如果你想在这里编译C++11代码,请使用以下其中之一:
g++ -std=c++11 input.cxx -o a.out
(通常是GNU编译器)g++ -std=gnu++11 input.cxx -o a.out
在Mavericks之前的OS X上:实际上,g++
是 clang++
的别名,而苹果旧版本的libstdc++是默认的。你可以通过传递 -stdlib=libc++
来使用libc++(它包含C++11库支持)。如果你想在这里编译C++11代码,请使用以下其中之一:
g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
(不是GNU编译器,而是clang!)g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
(不是GNU编译器,而是clang!)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=<...>
标志。自Xcode 10以来,不再支持使用libstdc++进行构建。已经使用libstdc++构建的现有代码将继续工作,因为仍然提供 libstdc++.6.dylib
,但不再支持对新代码使用libstdc++进行编译。
clang++ -std=c++11 input.cxx -o a.out
clang++ -std=gnu++11 input.cxx -o a.out
-std=c++11
或-std=gnu++11
指定了C++标准的版本,input.cxx
是输入文件名,-o a.out
则指定了输出文件名为a.out
。libc++
和libstdc++
有什么区别?它们都是C++标准运行库吗? - nn0p编辑:自从我写这个答案以来,GCC已经被更改为有条件地支持-stdlib
标志,但对于大多数支持的平台,默认情况下该支持是禁用的。即使启用了它,默认值仍然是-stdlib=libstdc++
,所以你永远不需要明确地指定它。GCC仍然会自动使用libstdc++。
编译器是否自动使用libstdc++?
是的,GCC始终使用libstdc++,除非你告诉它完全不使用任何标准库,可以使用-nostdlib
或-nostdlib++
选项(在这种情况下,你需要避免使用任何标准库功能,或者使用-I
、-L
和-l
标志来指定替代的头文件和库文件集)。
你不需要做任何其他事情。GCC自带了自己的C++标准库实现(libstdc++),它与GCC本身一起开发和测试,所以GCC的版本和libstdc++的版本是100%兼容的。如果你使用我正在使用Ubuntu 13.10上的gcc4.8.2,我想使用c++11标准。我已经将
-std=c++11
传递给编译器。
-std=c++11
编译,那么会启用g++
编译器中的C++11特性,同时也会启用libstdc++头文件中的C++11特性。-stdlib=libc++
,这个问题是在问你何时需要在gcc中使用-stdlib=libstdc++
。完全不一样的东西。 - undefinedgcc
,那么我认为它会假设它们只是C程序,并且不会链接任何*C ++*内容。但是如果您使用g ++
(或者在gcc
命令行中有任何cpp文件),那么我认为它会意识到应该包括stdc ++。但我不太确定。这是你想说的吗? - Aaron McDaidg++
而不是gcc
,则会自动链接到libstdc++。如果使用gcc
编译C++文件(扩展名为.cc
、.C
或.cpp
),则它将使用C++前端编译代码,并自动通过#include
使libstdc++头文件可用,与使用g++
编译时完全相同。只有链接步骤根据您使用的是gcc
还是g++
来处理libstdc++。 - Jonathan Wakely
-stdlib=libstdc++
不是有效的 gcc 标志。在 macOS 上可以使用它,因为在 macOS 上的g++
实际上是clang++
。请注意,此翻译仅供参考,不得用于正式场合。 - davmac