我非常了解在运行程序时幕后发生的事情。
在我的学校服务器上,每次我需要制作一个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
感谢。
答案 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
标志而有些对象不会用它构建。你会尝试删除旗帜,清洁然后重建吗?
最坏情况 - 删除变量规则并为每个目标文件编写三个不同的规则。