为啥 g++ 找不到 iostream.h?

Posted

技术标签:

【中文标题】为啥 g++ 找不到 iostream.h?【英文标题】:Why can't g++ find iostream.h?为什么 g++ 找不到 iostream.h? 【发布时间】:2012-10-27 18:49:12 【问题描述】:

我正在尝试了解如何在 Ubuntu 上使用 g++ 和(最终)Clang 从命令行编译 C++ 程序。

我找到了一个解释 MakeFiles 的网页,我正在按照他们的指示进行操作。 http://mrbook.org/tutorials/make/

我将这四个示例文件下载到各自的目录中。

main.cpp hello.cpp factorial.cpp functions.h

然后我继续运行他们的示例,说明如何在没有 MakeFile 的情况下手动编译。

g++ main.cpp hello.cpp factorial.cpp -o hello

当我从上面运行命令时,我从 g++ 收到以下错误:

main.cpp:1:22: fatal error: iostream.h: No such file or directory
compilation terminated.
hello.cpp:1:22: fatal error: iostream.h: No such file or directory
compilation terminated.

我编写 c++ 的唯一经验是使用 IDE,例如 VS C++ Express 或 CodeBlocks。编译器不应该知道 iostream.h 是什么以及在哪里可以找到它吗?

如何消除此错误以便程序能够编译?

感谢您的帮助。

【问题讨论】:

没有iostream.h,只有iostream 真的吗?所以当教程的文件说#include <iostream.h>它应该说#include <iostream>? 好吧,教程可能已经够老了,在编写时它仍然有效。 该教程链接到 2000 年 6 月 23 日 发布的版本 (3.79.1) 的 Make 文档。您可能会考虑寻找更新的教程。 作为学习make的教程,我觉得很好。只有 C++ 才是问题所在,无论如何您都应该从单独的来源中学习。 【参考方案1】:

在 C++ 语言被 ISO 标准化之前,头文件被命名为 <iostream.h>,但是当 C++98 标准发布时,它被重命名为 <iostream>(没有 .h)。将代码改为使用#include <iostream>,它应该可以编译。

您还需要在每个源文件中添加 using namespace std; 语句(或在每个对 iostream 函数/对象的引用前加上 std:: 说明符),因为预标准化 C++ 中不存在命名空间。 C++98 将标准库函数和对象放在std 命名空间内。

【讨论】:

在 C++<iostream.h>,但那是在引入命名空间之前。 C++98 没有&lt;iostream.h&gt;.h 形式的 C++ 标头名称来自 cfront、Glockenspiel C++、Comeau、Zortech 和 Borland 的标准前时代。 C++98 标准去掉了后缀,把所有的名字都放在了命名空间std 中。一些实现仍然提供.h 标头以实现向后兼容性。 我认为这不值得被否决。当然,你犯了一个错误,但每个人都犯了。您的其余答案是正确的,仅仅因为您的历史记录已关闭并不意味着我应该对您投反对票。很容易修复。 @Alf 等人:是的,对不起,我记错了历史。一票否决,好的,但是三票?这有点过分了。请查看编辑后的答案。 @AdamRosenfield +1 进行编辑。无论如何:记错可能没什么大不了的;但是,在 SO 上没有必要进行虚假陈述。我真的很喜欢 SO 也有利于更广泛地看待事物。出于这个原因,它是一个社区。​​span> 【参考方案2】:

&lt;iostream.h&gt; 从来都不是标准 C++ 标头,因为它没有成为 C++ 标准。

相反,我们在 1998 年收到了 &lt;iostream&gt;

避免使用非标准材料,例如&lt;iostream.h&gt;void main

但是,作为您当前预标准代码的实用解决方案,您可以尝试替换

#include <iostream.h>

#include <iostream>
using namespace std;

不保证有效,但很有可能会有效。

【讨论】:

更好的解决方案(恕我直言)是没有using namespace std;,而是在标准名称前添加std::【参考方案3】:

这里没有提到的另一个相关问题,所以我将它包括在内以供任何人将来参考,编译器需要从命令行更新环境路径变量以查找 c++ 头文件的位置。在 Windows 中,您可以使用“高级系统属性”GUI 更新路径环境并添加 c++ 包含文件的位置。这将在重新启动 shell 时自动更新 Windows cmd 和 Cygwin 中的 PATH 环境变量。

要从 Linux 或 Cygwin shell 类型更新您的 PATH... PATH=$PATH:/your_path_here 示例:PATH=$PATH:/cygdrive/c/cygwin/lib/gcc/i686-pc-mingw32/4.7.3/include/c++ 仅添加包含目录也是一个好主意: PATH=$PATH:/cygdrive/c/cygwin/lib/gcc/i686-pc-mingw32/4.7.3/include/ ...或者检查安装的包含文件的位置的正确目录,我建议安装 mingw 以与 Cygwin 一起使用,它是用 g++ 调用的。

要在 Cygwin 中安装其他所需的软件包,请重新运行 Cygwin 安装实用程序并检查从 Internet 安装以从 Web 存储库添加软件包并添加 mingw-gcc-g++ 和 mingw-binutils。 编译:g++ hello.cpp -o hello

如果使用 gcc 实用程序而不是使用以下命令进行编译: gcc hello.cpp -o hello -lstdc++ ...获取您的可执行文件。

只要您安装了 gcc 或 mingw 并且 c++ 包含文件的路径在您的路径环境变量中,这些命令就可以工作。

【讨论】:

错了。 PATH 环境变量用于指定可执行文件的位置。包含 gcc/g++ 文件的路径在 CPATH 环境变量中指定。

以上是关于为啥 g++ 找不到 iostream.h?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我装了vc运行c++程序的时候老是说找不到include文件?

为啥找不到这些符号?

为啥ios中的沙盒路径找不到文件

为啥在 iOS 10 中找不到 com.apple.nsurlsessiond 文件夹?

为啥我在尝试运行我的 iOS 应用程序时收到错误“找不到 FirebaseCore/FirebaseCore.h”文件

为啥 NSFileManager 找不到这些 png 文件?