我一直在读一本关于SFML游戏开发的书,他们使用unique_ptr' s。并且要使用它们,我知道在编译时我必须使用-std = c ++ 11标志,但是我在使用Makefile时遇到了问题。下面是我的Makefile的副本:
flags = -lsfml-graphics -lsfml-window -lsfml-system
main: main.cpp texture_holder.o
g++ main.cpp texture_holder.o -o Run $(flags) -std=c++11
texture_holder: texture_holder.cpp texture_holder.h
g++ texture_holder.cpp -c -std=c++11
.PHONY: clean
clean:
rm *.o Run
只需输入 make ,我就会遇到有关unique_ptr不是std成员的错误。但我无法弄清楚的是,当我输入 make texture_holder texture_holder.cpp时,编译就好了,然后运行 make 构建应用程序。我有错误的订单或者我遗失了什么吗?如果它有帮助,我可以附加我正在使用的代码,但就像我说的那样,它在我首先构建texture_holder目标时构建得很好。
答案 0 :(得分:3)
texture_holder.o
的规则错误,应该是:
texture_holder.o: texture_holder.cpp texture_holder.h
g++ texture_holder.cpp -c -std=c++11
IE中。包括.o
扩展名。
您问题的版本会发生什么情况,当您执行make texture_holder
时,您执行的特定规则实际上并未创建相应的文件texture_holder
,而是创建texture_holder.o
,因为,这是表达所产生的。 texture_holder
规则实际上是虚假规则,类似于main
和clean
(顺便说一句,您也应该main
添加.PHONY
。
如果您make main
,然后创建texture_holder.o
, make 使用隐式规则(因为没有明确的规则),它使用不同的编译命令。
答案 1 :(得分:2)
您有制定texture_holder
的规则,而不是texture_holder.o
。 main
的规则将尝试使用默认编译规则texture_holder.o
,而不是您的特殊规则。默认规则不会指定-std=c++11
,因此会出错。