开发者

problem finding a header with a c++ makefile

I've started working with my first makefile. I'm writing a roguelike in C++ using the libtcod library, and have the following hello world program to test if my environment's up and running:

#include "libtcod.hpp"

int main()
{
    TCODConsole::initR开发者_Python百科oot(80, 50, "PartyHack");
    TCODConsole::root->printCenter(40, 25, TCOD_BKGND_NONE, "Hello World");
    TCODConsole::flush();
    TCODConsole::waitForKeypress(true);
}

My project directory structure looks like this:

/CppPartyHack  
----/libtcod-1.5.1 # this is the libtcod root folder  
--------/include  
------------libtcod.hpp  
----/PartyHack  
--------makefile  
--------partyhack.cpp # the above code  

(while we're here, how do I do proper indentation? Using those dashes is silly.)

and here's my 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

I'm using Ubuntu, and my terminal gives me the following errors:

max@max-desktop:~/Desktop/Development/CppPartyhack/PartyHack$ make

g++ -c -o partyhack.o partyhack.cpp

partyhack.cpp:1:23: error: libtcod.hpp: No such file or directory

partyhack.cpp: In function ‘int main()’:

partyhack.cpp:5: error: ‘TCODConsole’ has not been declared

partyhack.cpp:6: error: ‘TCODConsole’ has not been declared

partyhack.cpp:6: error: ‘TCOD_BKGND_NONE’ was not declared in this scope

partyhack.cpp:7: error: ‘TCODConsole’ has not been declared

partyhack.cpp:8: error: ‘TCODConsole’ has not been declared

make: *** [partyhack.o] Error 1

So obviously, the makefile can't find libtcod.hpp. I've double checked and I'm sure the relative path to libtcod.hpp in INCDIR is correct, but as I'm just starting out with makefiles, I'm uncertain what else could be wrong. My makefile is based off a template that the libtcod designers provided along with the library itself, and while I've looked at a few online makefile tutorials, the code in this makefile is a good bit more complicated than any of the examples the tutorials showed, so I'm assuming I screwed up something basic in the conversion. Thanks for any help.


What happens here, is that

1) make evaluates the target all, which resolves to partyhack.

2) make evaluates the target partyhack, which resolves to $(CPP_OBJS)

3) make evaluates the target $(CPP_OBJS), which resolves to $(TMP)partyhack.o

4) make evaluates the target $(TMP)partyhack.o which resolves to partyhack.o

This is because TMP is not defined. Also note that the slash is missing after $(TMP).

5) make evaluates the target partyhack.o, and applies the implicit rule g++ -c -o partyhack.o partyhack.cpp

It does not apply the rule you specified, namely $(TEMP)/%.o : $(SRCDIR)/%.cpp because TEMP is not defined, so this evaluates to /partyhack.o : ./partyhack.cpp, and we are not building /partyhack.o because we are not in the root directory.

6) g++ does not find the include file, because the include directories were not passed to it, because your rule was not applied.

To fix this:

First, you need to define TEMP (see Nick Meyers answer).

TEMP = .

Second, you need to change the definition of CPP_OBJS (as Paul R suggested).

CPP_OBJS = %(TEMP)/partyhack.o

This will work if you invoke make inside the directory CppPartyHack/PartyHack.


Make appears to be using a built-in rule as opposed to your custom rule for *.cpp files. (See the ordering of the -c and -o options in make's output -- it's not the same as the ones you wrote). Check the definition of your C++ file rule.

My best guess is that the references to $(TEMP) are throwing it off. Where is this defined?

Also note that for C++, usually the variables CXX and CXXFLAGS are used for the compiler program and the flags, respectively. CPP is used for the C preprocessor program, CPPFLAGS for preprocessor flags and CFLAGS is used for the C compiler flags. That's probably why make is not using your CFLAGS when using its built-in C++ rules.


Maybe you should change the INCDIR to an absolute path rather than a relative one? The current working directory may not be what you think it is while make is running.


There's obviously a problem somewhere because your CFLAGS definitions are not being passed to g++.

Change:

CPP_OBJS = $(TEMP)partyhack.o

to:

CPP_OBJS = $(TEMP)/partyhack.o

Other than that I don't see anything wrong.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜