使用c ++ makefile查找标题的问题

时间:2010-05-17 21:22:10

标签: c++ makefile

我已经开始使用我的第一个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中的代码比教程显示的任何示例都要复杂得多。所以我假设我搞砸了转换中的一些基本内容。谢谢你的帮助。

4 个答案:

答案 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 ++,通常变量CXXCXXFLAGS分别用于编译器程序和标志。 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

除此之外,我没有看到任何错误。