C++:在 mac osx 上使用 std::cout 和 gcc

Posted

技术标签:

【中文标题】C++:在 mac osx 上使用 std::cout 和 gcc【英文标题】:C++: Using std::cout with gcc on a mac osx 【发布时间】:2010-02-12 06:22:26 【问题描述】:

我是 C++ 编程新手,我尝试在 Mac 上使用终端中的 gcc 进行第一次练习。

很遗憾,由于与 iostream 相关的问题,我无法编译。用一个简单的程序:

#include <iostream>

int main()


 std::cout << "hello world";
 std::cout << endl;
 return 0;

它给了我错误:

error: ‘endl’ was not declared in this scope

删除 cout

Undefined symbols:
  "___gxx_personality_v0", referenced from:
      ___gxx_personality_v0$non_lazy_ptr in cceBlyS2.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in cceBlyS2.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _main in cceBlyS2.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in cceBlyS2.o
  "std::cout", referenced from:
      __ZSt4cout$non_lazy_ptr in cceBlyS2.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

很明显,iostream 标头没有正确链接。我尝试了 "" 和 "iostream.h" 都没有成功。

有没有人有任何可以帮助我的提示? 谢谢!

【问题讨论】:

【参考方案1】:

您需要使用std::endl; -- 整个标准库位于std 命名空间中。看起来您在命令行上使用了gcc 而不是g++。后者自动执行正确链接 C++ 所需的步骤。

【讨论】:

感谢您!现在一切正常。感谢您帮助像我这样的新手! 我刚开始学习 C++,我只能说,哇,我不知道 GCC 和 G++ 之间有区别(呃),救了我的命。谢谢大佬。【参考方案2】:

endl; 属于 std 命名空间

您的 2 个选项如下:

1) 声明你的命名空间,例如

#include <iostream>
using namespace std;

int main() 
 cout << "hello world";
 cout << endl;
 return 0;

或使用std::endl; 例如

 std::cout << "hello world";
 std::cout << std::endl;
 return 0;

看看哪一个适合你。我推荐 1)(检查我没有做 std::cout,因为我已经声明了我的命名空间)因为它有助于减少每次输入 std::

【讨论】:

【参考方案3】:

您只需要使用std::endl;。或者,更好的是,使用方便的using 指令:

#include <iostream>

using namespace std;

int main()

    cout << "hello world";
    cout << endl;
    return 0;

【讨论】:

对于您需要访问的给定 x 而言,将命名空间设置为 using namespace std::x; 与一举将整个命名空间纳入范围相比,这与 using namespace std::x; 的目的不符。 @Chris:我不同意。虽然我肯定会避免在 头文件 中使用 using namespace std; 之类的东西,但我认为在源文件中非常好,尤其是像这样的简单文件。除非绝对必要,否则我认为没有理由到处使用std:: 污染源文件。我还希望永远不要重复使用 STL 中已经使用过的名称。引入整个命名空间会让我及早发现这样的错误。 @e.James:有一个小问题:你不知道std 命名空间中有什么——它可以而且确实在不同的实现之间有所不同。您可以让某些东西在任意长度内正常工作,然后停止使用不同的(a 版本)编译器。诚然,在 this 的情况下,您定义的 only 名称是 main,没有太多可能出错的地方——但是当/如果你再做除此之外,这是一个完全不同的故事。 @Jerry Coffin:我不得不承认我从来没有经历过这样的事情。不同的实现在std 命名空间中真的有不同的公共名称吗? @e.James:是的,当然。仅举一个例子,如果您想要 POSIX 兼容性,您必须定义大量不在 C 或 C++ 标准中的名称(一些在标准头文件中)。

以上是关于C++:在 mac osx 上使用 std::cout 和 gcc的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mac OSX 上模拟游戏手柄

使用 C++ 入口点让 SDL 在 OSX 上工作

C++ libsndfile 和 mac osx

在 Mac OSX 上安装 Qt 的调试版本

无法在 Mac OSX for i386 目标上使用我的应用程序构建 Apache Thrift

在 Mac OS X 上使用 Eclipse CDT 调试远程 Linux 应用程序