【问题标题】:C++ hello world on LinuxLinux 上的 C++ hello world
【发布时间】:2012-09-10 00:11:38
【问题描述】:

在 Windows 下,我安装了 MinGW 和 Eclipse,并使用 MinGW GCC 工具链创建了一个名为 foo 的新 C++ 项目,它可以编译、运行甚至调试。精彩的。

仍然在 Windows 下,我安装了 Cygwin,这是一项让我的互联网连接变得紧张的史诗般的任务。最终我指定了 Cygwin GCC 工具链和 bar 的项目名称。这可以编译并运行,但无法通过调试进行单步调试(声称找不到源代码)。

在 Linux 下,特别是 mint13,我安装了 Eclipse 的全唱全舞 C++ 版本以及所有的装饰,并创建了一个新的 C++ 项目,并选择了更鼓舞人心的名称 baz 和 Linux GCC 工具链。 Eclipse 抱怨找不到 iostream。

我对此感到很困惑。如果我启动一个终端窗口并运行 g++,就会发现它,很明显我至少有一些 GNU C++ 的东西。我不知道缺少什么。 Linux 对我来说是一个新世界。谁能提供指导?

作为记录,生成的代码位于名为 foo.cpp(或 bar.cpp,根据项目名称)的文件中,如下所示:

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World" << endl; // prints Hello World
  return 0;
}

@bmargulies - 我知道你的评论是在开玩笑,但我不会使用粉红色的 emacs。我会在 Windows 工作站上设置 SAMBA 并使用 Textpad,因为我有足够的东西来学习,而无需不必要地学习使用新的文本编辑器。我选择 Eclipse 的原因是徒劳地希望它可以提供一个带有集成调试器的工作基线,从中可以探索 Linux 上 C++ 的勇敢新世界。结合 MinGW,它确实在 Windows 上提供了。

我知道这里最大的问题不是工具,而是我的无知和来自不同世界的一系列期望。缺乏使用 C++ 的经验使情况更加复杂——我在 C++ 方面的唯一经验是 15 年前使用 TurboC。

一个非常混乱的来源是用于解析库引用的机制。

很多项目似乎都使用 make,据我所知,它是一种用于编译和链接项目或项目集的脚本文件。 Make 似乎有多种风格,似乎也有使用 makefile 的替代品以及不使用的替代品。

[咒骂]什么乱七八糟的。

@Basile - 我不喜欢使用 Eclipse,而且我很清楚脚本比点击使用 IDE 配置的好处(其中最重要的是您可以对构建过程进行源代码控制) .我感谢你的阅读清单。也许这是一个愚蠢(或不成熟)的问题,但我不得不问:如果没有像 Eclipse 这样将编辑器与构建工具集成在一起的 IDE,是否可以进行逐步调试?

@bmargulies - 我同意你的观点,工具链定义可能有问题,但我缺乏对此进行有意义调查的背景和经验。如上所述,我在 Windows 下使用不同的工具链取得了不同程度的成功,因此可以合理地得出结论,工具链是问题的重要因素。唉,在Linux下我不能选择MinGW工具链。


按照 Norm 的建议,我能够从命令行编译 foo.cpp。 hello world 程序以所需的行为执行,但我仍然不知道 g++ 是如何知道如何在花哨的 IDE 工具不知道的情况下解析 iostream 的。

在 foo 中添加了几行代码并对其进行编译,以试用 gdb。有用!谁能想到您可以使用终端窗口进行逐步调试!不过有点笨拙。

虽然 Basile 认为不需要花哨的 IDE 显然是正确的,但这有点像说我不需要摩托车,因为我可以走路。我会看看提到的其他 IDE,但我怀疑它们都将使用相同的工具链,因此都会受到我错误配置的任何影响。


Basile,请原谅我移动了球门柱。我最初的目标确实是“编译并运行 hello.cpp”,但 gdb 不可避免地是下一步。它有效,如果这是 80 年代初在 uni 使用电传打字机,我现在可能会很高兴。但现在不是 80 年代初,我在过去的十年里一直在使用语法着色、自动完成、变量嗅探、编辑和继续调试,所以(我是忘恩负义的草皮)现在我想要,嗯,一切!

【问题讨论】:

  • 使用 gnu emacs 而不是 Eclipse 进行 C++ 开发 :-)
  • 说真的,Eclipse 中的工具链定义有问题。
  • 您只需要g++ 在 Linux 上编译 C++ 代码(不需要 Eclipse 或 IDE)。但是您需要正确调用它,并且学习如何使用诸如make 和代码Makefile-s 之类的构建器会有所帮助。因此,在编辑器(Emacs、Gedit、Geany..)中编写您的helloworld.cpp,学习编写Makefile,输入make 来构建您的程序,然后输入helloworld 来运行它。
  • Hi -1) 确保您的源文件后缀为“.cpp”(用于“C++”)而不是 .c(用于“C”,它没有 iostream)2)确保正确的标头(和库!)目录包含在您的项目中,并且 3) 在此处查找 $LANG 的潜在问题:help.eclipse.org/indigo/…
  • 我确实从他们的源代码编译了很多免费(gpl-ed)的 Linux 软件,但没有一个使用 Eclipse。这意味着什么......

标签: linux eclipse g++


【解决方案1】:

我之前用过eclipse c/C++ 版本,遇到过很多同样的问题。对我来说,eclipse 很难使用。我建议使用命令行来编译 c/c++ 程序。在我看来,理解如何创建可执行文件更容易也很重要。

g++ -Wall -g Hello.cpp -o Hello

会产生一个可执行的Hello。 -Wall 是一个选项,在您编译程序时会为您提供更多警告。如果你不修复它们,一些警告会使你的程序崩溃,所以很高兴能提前看到它们。 -g 为您提供调试符号,以便 gdb 能够逐步执行程序。

当您使用 gdb Hello 进入 gdb 时,您可以查看此 gdb cheatsheet

一旦您开始使用多个源文件编写程序,您将需要了解编译中的两个主要步骤。第一步将每个单独的源文件转换为目标文件。下一步将所有目标文件链接在一起以生成可执行文件。 This link 可能会解释编译和链接,显然维基百科也是该信息的良好来源。

【讨论】:

  • 即使您还没有回答 Eclipse 问题,这可能是一个更有用的答案,所以您会得到荣誉。
  • g++如何知道在哪里可以找到iostream和其他头文件?
  • 我在下面改进了我的答案来回答这个问题。
  • 如果你好奇的话,将-v 传递给g++ 以了解它在哪里可以找到标准头文件和库...
  • 谢谢,巴西尔。我认为带有 .so 扩展名的文件用于类似于 Windows DLL 文件的动态链接?
【解决方案2】:

您不需要像 Eclipse 这样花哨的 IDE。在 Linux 下开发的常用方法是使用多种工具。

使用emacsgedit 之类的编辑器来编辑您的helloworld.cpp 文件。在终端中输入emacsgedit 以启动编辑器(可能后跟helloworld.cpp,即编辑文件的名称)。

然后,使用以下命令编译

g++ -Wall -g helloworld.cpp -o helloworld

您在终端中输入的内容。改进您的代码,直到没有给出警告。如果您希望 GCC 进行优化(以及 -O2-O3 进行更多优化),您可以在上面的 -g 之后添加 -O。如果您想对二进制可执行程序进行基准测试或发布,您应该要求 GCC 进行优化。请注意,g++ 知道如何链接标准 C++ 库 (libstdc++.so),并且标头位于 g++ 已知的标准位置(您可以将 -v 参数添加到 g++ 以使其显示发生)。如果您想使用其他库,则需要更多参数。

g++ 的参数顺序很重要,特别是对于 -I 选项(包括目录)和 -l(库)。

如果你想调试你的程序(避免向 GCC 询问优化),输入

gdb helloworld

它将运行调试器。了解更多关于gdb 的信息(当然你可以使用gdb 一步一步来做;你将首先使用gdbnextstepbreakbacktrace 命令,以及其他-e.g. watch 有时非常有用。)

如果您想在没有调试器的情况下运行程序,只需键入

./helloworld

稍后,您将需要在多个编译单元中开发一个程序。学习使用像 make 这样的 bulder。还有其他构建器程序,例如 omake 和许多其他程序。

阅读更多关于GCC(提供g++)、Gnu MakeGDB(gnu 调试器)、EmacsGIT version control的信息

我已将我的 emacs 配置为通过按 F12 键在其中运行 make。如果你愿意,可以在emacs下编译。

对于用 C++ 编码的图形用户界面应用程序,请学习使用 Qt

PS。 Linux 比其他系统更面向命令行。相信我们,这具有令人难以置信的优势。但在其他系统(例如 Microsoft 销售的系统)上,这是一种不同的工作方式。

PS。如果你喜欢 IDE,可以考虑geanyanjutakate。然而,在典型的 Linux 发行版(Debian、Ubuntu、Fedora 等)中,很少有免费软件(用 C 或 C++ 编码)是使用这些(或使用 Eclipse,在 Linux 上通常与 Java 开发相关)构建的。恕我直言,这很重要。

【讨论】:

  • 我选择 Eclipse 作为入口点,希望它能够为在 any 平台上编译所涉及的无数选项和路径提供适当的默认值。作为一个在 Linux 上开发 WRT 的新手,我最大的问题是我什至不知道自己的无知程度,这使得提出正确的问题变得困难。你是在告诉我 Eclipse 不能给我我想要的东西,以开箱即用的罐装配置作为实验学习的起点吗?
  • 是的,我告诉你不需要 Eclipse(我知道没有开发人员在 Linux 上使用 C 或 C++ 软件)。你最好学会一起使用几个工具。我在回复中列出了它们。我在回复中提供了几个链接。
  • 您可以尝试从他们的源代码树中编译一些免费软件(例如在 freecode.comsourceforge.net 等上选择),以了解它们是如何构建的。
  • 我不明白在 Linux 上“开箱即用的固定配置”是什么意思。我列出的命令与我输入的完全一样(除非我打错了)。您不需要配置它们。您可能希望稍后通过配置文件配置一些工具,或者将它们组合到您自己的 shell 脚本中。
  • 我正在研究您的阅读建议。重新罐装配置:Visual Studio 创建的其中一件事是控制诸如路径和构建选项之类的设置的项目文件。如果您不摆弄,您可以预期单次击键将编译、链接并启动逐步调试会话。这是精心设计的 IDE 的重点。人们可以开始并做事,而无需学习处理异常情况和边缘条件的无穷无尽的选项。
猜你喜欢
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多