我已经开始使用我的第一个Makefile。我正在使用libtcod库在C++中编写类似于rogue的程序,并具有以下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”
制作:*** [partyhack.o]错误1

因此很明显,makefile找不到libtcod.hpp。我已经仔细检查过,并且我确定INCDIR中libtcod.hpp的相对路径是正确的,但是由于我只是从makefile开始,所以我不确定还有什么错误。我的makefile基于libtcod设计人员提供的模板以及库本身,尽管我看过一些在线makefile教程,但该makefile中的代码比该教程显示的任何示例都复杂得多。 ,所以我假设我在转换中搞砸了一些基本知识。谢谢你的帮助。

最佳答案

这里发生的是

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,则此方法将起作用。

关于c++ - 查找带有C++ Makefile的标题时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2852907/

10-08 22:43