проблема с поиском заголовка с make-файлом c ++ - PullRequest
2 голосов
/ 18 мая 2010

Я начал работать с моим первым make-файлом. Я пишу roguelike на C ++ с использованием библиотеки libtcod, и у меня есть следующая программа 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  

(пока мы здесь, как мне сделать правильный отступ? Использовать эти черточки глупо.)

и вот мой make-файл:

<code>
SRCDIR = .
INCDIR = ../libtcod-1.5.1/include
CFLAGS = $(FLAGS) -I$(INCDIR) -I$(SRCDIR) -Wall
CC = gcc
CPP = g++
.SUFFIXES: .o .h .c .hpp .cpp</p>

<p>$(TEMP)/%.o : $(SRCDIR)/%.cpp
 $(CPP) $(CFLAGS) -o $@ -c $< 
$(TEMP)/%.o : $(SRCDIR)/%.c
 $(CC) $(CFLAGS) -o $@ -c $< </p>

<p>CPP_OBJS = $(TEMP)partyhack.o</p>

<p>all : partyhack</p>

<p>partyhack : $(CPP_OBJS)
 $(CPP) $(CPP_OBJS) -o $@ -L../libtcod-1.5.1 -ltcod -ltcod++ -Wl,-rpath,.</p>

<p>clean :
 \rm -f $(CPP_OBJS) partyhack

Я использую Ubuntu, и мой терминал выдает мне следующие ошибки:

max @ max-desktop: ~ / Рабочий стол / Разработка / 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

Очевидно, что make-файл не может найти libtcod.hpp. Я дважды проверил и уверен, что относительный путь к libtcod.hpp в INCDIR правильный, но поскольку я только начинаю с make-файлами, я не уверен, что еще может быть не так. Мой make-файл основан на шаблоне, который разработчики libtcod предоставили вместе с самой библиотекой, и хотя я посмотрел несколько онлайновых руководств по make-файлам, код в этом make-файле немного сложнее, чем любой из примеров, приведенных в руководствах , поэтому я предполагаю, что я испортил что-то основное в преобразовании. Спасибо за любую помощь.

Ответы [ 4 ]

3 голосов
/ 18 мая 2010

Что здесь происходит, это

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 (см. Ответ Ника Мейерса).

TEMP = .

Во-вторых, вам нужно изменить определение CPP_OBJS (как предложил Пол Р.).

CPP_OBJS = %(TEMP)/partyhack.o

Это будет работать, если вы вызовете make внутри каталога CppPartyHack / PartyHack.

1 голос
/ 18 мая 2010

Make, похоже, использует встроенное правило, в отличие от вашего пользовательского правила для файлов * .cpp. (Смотрите порядок параметров -c и -o в выводе make - он не такой, как вы написали). Проверьте определение вашего правила файла C ++.

Мое лучшее предположение заключается в том, что ссылки на $ (TEMP) отбрасывают его. Где это определено?

Также обратите внимание, что для C ++ обычно переменные CXX и CXXFLAGS используются для программы компилятора и флагов соответственно. CPP используется для программы препроцессора C, CPPFLAGS для флагов препроцессора и CFLAGS используется для флагов компилятора C. Вероятно, поэтому make не использует ваш CFLAGS при использовании встроенных правил C ++.

0 голосов
/ 18 мая 2010

Очевидно, что где-то проблема, потому что ваши определения CFLAGS не передаются в g ++.

Изменение:

CPP_OBJS = $(TEMP)partyhack.o

до:

CPP_OBJS = $(TEMP)/partyhack.o

Кроме этого, я не вижу ничего плохого.

0 голосов
/ 18 мая 2010

Может быть, вам следует заменить INCDIR на абсолютный путь, а не на относительный? Текущий рабочий каталог может не совпадать с текущим, пока выполняется make.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...