我已经开始使用我的第一个makefile了。我正在使用libtcod库在C ++中编写roguelike,并使用以下hello world程序来测试我的环境是否已启动并运行:
#include "libtcod.hpp"
int main()
{
TCODConsole::initRoot(80, 50, "PartyHack");
TCODConsole::root->printCenter(40, 25, TCOD_BKGND_NONE, "Hello World");
TCODConsole::flush();
TCODConsole::waitForKeypress(true);
}
我的项目目录结构如下所示:
/CppPartyHack
----/libtcod-1.5.1 # this is the libtcod root folder
--------/include
------------libtcod.hpp
----/PartyHack
--------makefile
--------partyhack.cpp # the above code
(虽然我们在这里,我该怎么做适当的缩进?使用这些破折号是愚蠢的。)
这是我的makefile:
SRCDIR = .
INCDIR = ../libtcod-1.5.1/include
CFLAGS = $(FLAGS) -I$(INCDIR) -I$(SRCDIR) -Wall
CC = gcc
CPP = g++
.SUFFIXES: .o .h .c .hpp .cpp
$(TEMP)/%.o : $(SRCDIR)/%.cpp
$(CPP) $(CFLAGS) -o $@ -c $<
$(TEMP)/%.o : $(SRCDIR)/%.c
$(CC) $(CFLAGS) -o $@ -c $<
CPP_OBJS = $(TEMP)partyhack.o
all : partyhack
partyhack : $(CPP_OBJS)
$(CPP) $(CPP_OBJS) -o $@ -L../libtcod-1.5.1 -ltcod -ltcod++ -Wl,-rpath,.
clean :
\rm -f $(CPP_OBJS) partyhack
我正在使用Ubuntu,我的终端给了我以下错误:
max @ max-desktop:〜/ Desktop / Development / CppPartyhack / PartyHack $ make
g ++ -c -o partyhack.o partyhack.cpp
partyhack.cpp:1:23:错误:libtcod.hpp:没有这样的文件或目录
partyhack.cpp:在函数'int main()'中:
partyhack.cpp:5:错误:'TCODConsole'尚未声明为
partyhack.cpp:6:错误:'TCODConsole'尚未声明为
partyhack.cpp:6:错误:此范围内未声明'TCOD_BKGND_NONE'
partyhack.cpp:7:错误:'TCODConsole'尚未声明为
partyhack.cpp:8:错误:'TCODConsole'尚未声明为
make:*** [partyhack.o]错误1
很明显,makefile找不到libtcod.hpp。我已经仔细检查了一下,我确定INCDIR中libtcod.hpp的相对路径是正确的,但是我刚开始使用makefile时,我不确定还有什么可能是错的。我的makefile基于libtcod设计者提供的模板以及库本身,虽然我看了一些在线makefile教程,但是这个makefile中的代码比教程显示的任何示例都要复杂得多。所以我假设我搞砸了转换中的一些基本内容。谢谢你的帮助。
答案 0 :(得分:3)
这里发生了什么,是
1)make评估目标all
,该目标解析为partyhack
。
2)make评估目标partyhack
,后者解析为$(CPP_OBJS)
3)make评估目标$(CPP_OBJS)
,该目标解析为$(TMP)partyhack.o
4)make评估解析为$(TMP)partyhack.o
partyhack.o
这是因为没有定义TMP。另请注意$(TMP)
之后缺少斜杠。
5)make评估目标partyhack.o
,并应用隐式规则g++ -c -o partyhack.o partyhack.cpp
它不应用您指定的规则,即$(TEMP)/%.o : $(SRCDIR)/%.cpp
,因为TEMP未定义,因此评估为/partyhack.o : ./partyhack.cpp
,而我们不构建/partyhack.o
因为我们不在根目录。
6)g ++找不到包含文件,因为包含目录没有传递给它,因为你的规则没有被应用。
解决此问题:
首先,您需要定义TEMP(请参阅Nick Meyers的回答)。
TEMP = .
其次,您需要更改CPP_OBJS的定义(正如Paul R所建议的那样)。
CPP_OBJS = %(TEMP)/partyhack.o
如果你在目录CppPartyHack / PartyHack中调用make,这将有效。
答案 1 :(得分:1)
Make似乎使用内置规则而不是* .cpp文件的自定义规则。 (请参阅make输出中-c
和-o
选项的顺序 - 它与您编写的内容不同。检查C ++文件规则的定义。
我最好的猜测是对$(TEMP)的引用将其抛弃。这定义在哪里?
另请注意,对于C ++,通常变量CXX
和CXXFLAGS
分别用于编译器程序和标志。 CPP
用于C预处理程序,CPPFLAGS
用于预处理程序标志,CFLAGS
用于C编译器标志。这可能是make
在使用其内置C ++规则时未使用CFLAGS
的原因。
答案 2 :(得分:0)
也许您应该将INCDIR
更改为绝对路径而不是相对路径?当make正在运行时,当前工作目录可能不是您的想法。
答案 3 :(得分:0)
在某处显然存在问题,因为您的CFLAGS定义未传递给g ++。
变化:
CPP_OBJS = $(TEMP)partyhack.o
为:
CPP_OBJS = $(TEMP)/partyhack.o
除此之外,我没有看到任何错误。