0

我很难理解运行程序时幕后发生的事情。

在我的学校服务器上,每次我需要制作 makefile 时,我只使用 gcc 和几乎相同的代码。

我下载了我的程序以在 NetBeans 中调试它,并在数小时/数天后.. 我终于几乎让一切正常。

在查看了此处和其他站点上的一些帖子后,我发现由于某种原因我需要使用 g++ 而不是 gcc 来编译,因为我使用的是 MacBook。我不太明白。但是如果我将 gcc 更改为 g++ 并在我的 makefile 中运行这一行:

编辑:

 g++ -c $< -o $@ -std=c++0x -lstdc++

我得到一个错误。但是,如果我删除“-std=c++0x”并再次运行 make.. 一切都很好。

但是如果我运行我的“make clean”,我必须再做一次..

当我将程序放回学校服务器时,这会搞砸一切吗?或者只要我在服务器上有一个与我的 MacBook 上的 makefile 不同的 makefile 就可以了吗?

有人可以帮助排除为什么会发生这种情况以及我如何解决它吗?

这是我第一次运行make时的makefile:

OBJECTS = Ammunition.o Armor.o Consumable.o 
HEADERS = Ammunition.h Armor.h Consumable.h 

all: Jhack

%.o: %.cpp $(HEADERS)
    g++ -c $< -o $@ -std=c++0x

Jhack: $(OBJECTS) main.o
    g++ -o Jhack $^

clean:
    rm -f *.o Jhack

run: Jhack
    ./Jhack

谢谢。

4

3 回答 3

1

您可能正在使用旧的实验版本的 GCC。评论中的“ConceptGCC”和-std=c++0x旗帜告诉我。现代 GCC 变体将-std=c++11改为使用。

你永远不需要使用 g++ 而不是 gcc。这只是一种方便,因此您不需要传递编译 C++ 所需的所有 gcc 选项。尤其-lstdc++是 g++ 所暗示的。

由于您使用的是一个相当不寻常的“ConceptGCC”包,我建议您用普通的 GCC 版本 4.8.0 替换它。

要调试 make 正在尝试做的事情,请运行make -n. 然后,您可以手动运行这些命令以准确查看发生了什么。

于 2013-04-29T08:06:14.810 回答
1

首先,对于 Linux GNU C 编译器,gcc是 C 编译器,而g++是 C++ 编译器。这意味着当你用 gcc 编译时,你所有的错误信息基本上都是在说,“我不知道这些奇怪的语法是什么”。

您的学校没有使用 Linux 服务器,或者“gcc”可能有指向 c++ 编译器的链接。或者核心 make 规则正在用 g++ 替换您的编译器选择。

我认为在这方面您无需担心太多。只要记住区别,并可能用你的makefile中的宏替换gcc和g++。

至于 -std 选项,这是选择要编译的 C++ 标准版本。由于您的某些代码需要 2011 C++ 标准,因此您需要使用 -std 选项指定它。如果您查看 g++ 手册页,它应该会告诉您支持哪些选项。

你可以试试-std=c++0xor -std=c++11or-std=gnu++11

其中任何一个都应该为您提供所需的功能。根据我搜索的内容,您无需指定-std=stdc++,因为我认为g++ 默认包含该内容。

于 2013-04-29T08:24:12.433 回答
0

贾斯汀,我不知道是什么std=c++0x(我查了一下,但我不知道哪些“实验性功能”可能会受到影响......),但如果删除它有帮助,那么就删除它。

您所描述的对我来说听起来像是有些对象需要std=c++0x标志,而有些则不会用它来构建。您会尝试仅删除标志,清洁然后重建吗?

最坏的情况 - 删除变量规则并为每个目标文件编写三个不同的规则。

于 2013-04-29T06:59:29.480 回答