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

Why do I have to double run make to fully compile my program? GNU c++

本文关键字:编译 我的 程序 c++ GNU make 运行 为什么      更新时间:2023-10-16

我很难理解运行程序时幕后发生了什么。

在我的学校服务器上,我只使用gcc和几乎相同的代码,每次我需要做一个makefile lol。

我下载了我的程序,在NetBeans中调试它,几小时/几天后。我终于把一切都修好了。

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

编辑:

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

得到一个错误。但是如果我删除"-std=c++0x"然后再次运行make ..一切就绪。

但是如果我运行"make clean"我得重做一遍。

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

有人能帮我解释一下为什么会发生这种情况,我怎么可能解决它?

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

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

谢谢。

首先,对于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++中。

您可能正在使用旧的、实验性的GCC版本。评论中的"ConceptGCC"和-std=c++0x标志告诉了我这一点。现代的GCC变体会使用-std=c++11

你从来没有需要使用g++而不是gcc。这只是为了方便,所以您不需要传递编译c++所需的所有gcc选项。特别地,-lstdc++是由g++隐含的。

由于您使用的是一个相当不寻常的"ConceptGCC"包,我建议您将其替换为正常的GCC版本4.8.0。

要调试make正在尝试做什么,运行make -n。然后,您可以手动运行这些命令,以查看究竟发生了什么。

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

你所描述的听起来像一些对象需要std=c++0x标志,有些不会用它来构建。你能试着把国旗取下来,清理干净,然后重建吗?

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