何时需要使用标志 -stdlib=libstdc++
When is it necessary to use the flag -stdlib=libstdc++?
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++
的别名,Apple的旧版本的libstdc++是默认的。您可以通过传递 libc++(包括 c++11 库支持)来使用 -stdlib=libc++
.如果要在此处编译 c++11 代码,请使用以下方法之一:
-
g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
(叮当,不是GNU编译器! -
g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
(叮当,不是GNU编译器! -
clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
-
clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
在 OS X 上,因为 Mavericks: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
使用gcc 进行编译时,何时需要对编译器和链接器使用标志
-stdlib=libstdc++
?
简短回答:从不
更长的答案:-stdlib
是一个Clang标志,不适用于任何曾经发布的GCC版本。在macOS上,有时gcc
和g++
命令实际上是Clang而不是GCC的别名,并且Apple发布的libstdc++版本是古老的(大约2008年),因此当然它不支持C++11。这意味着在 macOS 上使用 Clang-pretending-to-be-GCC 时,您可以使用 -stdlib=libc++
来选择 Clang 新的兼容 C++11 的库,也可以使用 -stdlib=libstdc++
来选择属于博物馆的 libstdc++ 的 C++11 之前古董版本。但是在GNU/Linux上gcc
和g++
确实是GCC而不是Clang,因此-stdlib
选项根本不起作用。
编辑:自从我写了这个答案以来,GCC 已更改为有条件地支持 -stdlib
标志,但对于大多数平台,默认情况下禁用该支持。即使启用它,默认值也是-stdlib=libstdc++
,因此您仍然不需要明确地说出来。GCC 仍然会自动使用 libstdc++。
编译器是否自动使用 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
进行编译,则会启用编译器中的C++11功能g++
以及libstdc++标头中的C++11功能。
而不是 gcc 前端,编译器会自动使用 libstdc++。
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- 在运行时读取 libstdc++ 版本
- libstdc++ 文件系统中未初始化的用法?
- 难以理解 libstdc++ 的红黑树迭代器
- C++使用现代编译器编译的项目,但链接到过时的libstdc++
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- Mingw32无法静态链接到libgcc_s_dw2-1、libstdc++-6、libwinpthread-1(Qt
- 在 xcode 上使用 stdlib.h
- 为什么C++可执行文件在与较新的libstdc++.so链接时运行得更快?
- libstdc++.so.6:添加符号时出错:命令行中缺少 DSO
- g++ libstdc++.so.6:从 4.8.5 升级到 GCC 版本 7.3.0 后找不到版本 'CXXABI_1.3.9'
- std::span constructor, libcxx vs libstdc++, template vs non-
- 在 docker 容器之间传输时缺少 stdlib 符号
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- 75:15:致命错误:stdlib.h:没有这样的文件或目录 #include_next <stdlib.h>
- 在继承自 std::variant 的类上使用 std::visit——libstdc++ 与 libc++
- 如何处理libstdc++跨执行边界抛出的异常
- 在libc++和libstdc++之间的std::map上使用std::find时的实现差异
- cc1plus:错误:使用 HXCPP "-stdlib=libstdc++"无法识别的命令行选项
- 何时需要使用标志 -stdlib=libstdc++