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