Makefile目标错误

时间:2014-05-14 14:40:37

标签: c++ c++11 makefile

我一直在读一本关于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目标时构建得很好。

2 个答案:

答案 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规则实际上是虚假规则,类似于mainclean(顺便说一句,您也应该main添加.PHONY

如果您make main,然后创建texture_holder.o make 使用隐式规则(因为没有明确的规则),它使用不同的编译命令。

答案 1 :(得分:2)

您有制定texture_holder的规则,而不是texture_holder.omain的规则将尝试使用默认编译规则texture_holder.o,而不是您的特殊规则。默认规则不会指定-std=c++11,因此会出错。