1

在 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 时知道如何解析 iostream 的。

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

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


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

4

2 回答 2

2

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

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

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

当你通过使用进入 gdb 时,gdb Hello你可以查看这个gdb 备忘单

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

于 2012-09-10T02:51:56.720 回答
0

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

使用类似emacs或的编辑器gedit来编辑您的helloworld.cpp文件。在您的终端中键入emacsgedit以启动编辑器(可能后跟helloworld.cpp即编辑文件的名称[s])。

然后,使用以下命令编译

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

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

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

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

gdb helloworld

这将运行调试器。了解更多gdb(当然你可以用 gdb 一步一步来做;你首先会使用next, step, break,backtrace的命令gdb,其他的——例如watch有时非常有用。)

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

./helloworld

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

阅读有关GCC(提供g++)、Gnu MakeGDB(gnu 调试器)、EmacsGIT 版本控制的更多信息

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

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

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

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

于 2012-09-10T01:00:57.967 回答