为什么我必须双重运行才能完全编译我的程序? GNU c ++

时间:2013-04-29 05:56:27

标签: c++ compilation linker makefile gnu

我非常了解在运行程序时幕后发生的事情。

在我的学校服务器上,每次我需要制作一个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

感谢。

3 个答案:

答案 0 :(得分:1)

你可能会使用一个古老的实验版GCC。评论中的“ConceptGCC”和-std=c++0x标志告诉我。现代GCC变体将改为使用-std=c++11

你从不需要使用g ++而不是gcc。这只是一个方便,所以你不需要传递编译C ++所需的所有gcc选项。特别是,g ++隐含-lstdc++

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

要调试make尝试执行的操作,请运行make -n。然后,您可以手动运行这些命令,以准确查看发生的情况。

答案 1 :(得分: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++0x-std=c++11-std=gnu++11

任何这些都应该为您提供所需的功能。基于我搜索过的内容,您不需要指定-std=stdc++,因为我认为默认包含在g ++中。

答案 2 :(得分:0)

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

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

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