6

在过去的几个月里,我一直在学习 C++ 并使用终端。我的代码使用 g++ 和 C++11 编译和运行良好,但在过去几天它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的 C++ 标准。

我首先得到的错误与头文件中的#include <array> 相关。不知道为什么会发生这种情况,但我通过使用 boost/array 来解决它。我无法解决的另一个错误是 std::stoi。array 和 stoi 都应该在 C++11 标准库中。我制作了以下简单的代码来演示发生了什么:

//
//  stoi_test.cpp
//
//  Created by ecg
//

#include <iostream>
#include <string> // stoi should be in here

int main() {

    std::string test = "12345";
    int myint = std::stoi(test); // using stoi, specifying in standard library
    std::cout << myint << '\n'; // printing the integer

    return(0);

}

尝试使用 ecg$ g++ -o stoi_trial stoi_trial.cpp -std=c++11 编译

array.cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;您指的是 'atoi' 吗?int myint = std::stoi(test); ~~~~~^~~~ atoi /usr/include/stdlib.h:149:6: 注意:'atoi' 在这里声明 int atoi(const char *); ^ array.cpp:13:27: 错误:没有从 'std::string' (aka 'basic_string') 到 'const char *' int myint = std::stoi(test) 的可行转换;^~~~ /usr/include/stdlib.h:149:23: 注意:将参数传递给这里的参数 int atoi(const char *); ^ 2 个错误生成。

在使用 gcc 或 clang++ 和 -std=gnu++11 时,我也会在编译时遇到这些错误(我猜它们都依赖于相同的文件结构)。无论我在代码中指定 std:: 还是指定 using namespace std;,我也会得到相同的错误。

我担心这些问题是由于 9 月通过 Xcode 更新命令行工具或因为我安装了 boost 而这以某种方式弄乱了我的 C++11 库。希望有一个简单的解决方案。

我的系统:

配置: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-> dir=/usr/include/c++/4.2.1 Apple LLVM 5.0 版(clang-500.2.76 )(基于 LLVM 3.3svn)目标:x86_64-apple-darwin12.5.0 线程模型:posix

感谢您提供的任何见解。

4

1 回答 1

5

clang有一个奇怪的stdlib,编译的时候需要加上下面的flag

-stdlib=libc++

你的片段适用于我的mac

g++ -std=gnu++11 -stdlib=libc++ test.cpp -o test

这个答案描述了问题

于 2013-10-10T03:57:28.797 回答