2013-07-21 2 views
1

i wrting простой make-файл для файлов C++, но вот проблема, которую я не понимаю. У меня есть 2 папкиC++ Makefile% .c works,% .cpp not?

/SRC для файлов .cpp

  • main.cpp
  • проверка каст

/включают .hpp файлы

  • check.hpp

Мои Makefiles выглядит следующим образом

LIBS = -lsfml-graphics -lsfml-window -lsfml-system 
CC = g++ 
VPATH = src include 
CPPFLAGS = -I include 

### Files ### 
OBJ = main.o check.o 

### Rules ### 
all: sfml-app 

sfml-app: $(OBJ) 
    $(CC) -o sfml-app $(OBJ) $(LIBS) 

%.o: %.c 
    $(CC) -c $< 

clean: 
    rm -rf *o $(OBJ) 

если я использовать мой Makefile любит это, все работает отлично. Но если я изменить % .o:% .c на % .o:% .cpp он сказал

src/main.cpp:2:21: critical error: check.hpp: file or folder not found 

это неправильно писать .cpp вместо .c даже это проект с ++ ? Это немного смутило меня. Почему .c работает finde и .cpp нет.

благодарит за вашу помощь :)!

+0

'CC = g ++' - *** WRONG *** –

+1

@ H2CO3 На самом деле вы * нуждаетесь в этом правиле, если не перегружаете автоматическое правило для связывания (не нужно!), Поскольку 'make' использует' $ (CC) 'для привязки, * not *' $ (LD) ', по крайней мере, на моей системе (и насколько я знаю, это довольно нормально). –

+0

Вы получаете ошибку компиляции. Отправьте файл 'main.cpp'. Существует ли 'main.hpp' в правильной папке? –

ответ

3

Переменные флагов для языка C++ называются CXXFLAGS, и вы должны использовать $(CXX) вместо $(CC) в своем коде. CPPFLAGS - переменная для аргументов препроцессора.

+0

Просто отметим, что он использует' CPPFLAGS' для аргументов препроцессора: '-I' является аргументом препроцессора. Единственная переменная неправильная, как вы говорите, он должен использовать 'CXX' не' CC' для компилятора C++. – MadScientist

+0

Аргументы препроцессора Diffferent. CPPFLAGS используется, когда вы используете '$ (CPP) myfile.txt_pp> myfile.txt' - то есть вы используете препроцессор C для изменения текстового файла или какого-либо другого контента« не для C-компилятора »(или если вы препроцессор перед компиляцией по какой-то причине) –

+0

Итак, что же такое CPPFLAGS или CXXFLAGS? ^^ –

5

Потому что делают пытается построить .o из .cpp файла, когда вы пишете правило, как %.o : %.c это не имеет никакого влияния на макияж, потому что делают не пытается построить .o из .c. Из-за этого make использует свои собственные встроенные правила для компиляции файла .cpp в файл .o, и встроенное правило работает нормально.

При изменении правила быть %.o : %.cpp, теперь ваше правило соответствует тому, что сделать хочет построить и так сделать пользы ваше правила вместо своего собственного встроенного в правиле. Очевидно, что ваше правило нарушено и не работает.

Почему это не работает? Поскольку вы не используете $(CPPFLAGS), и поэтому флаги -I include не передаются компилятору, поэтому компилятор не может найти ваши файлы заголовков.

1

Используйте флаги файлов стандартный замыкающих

CXX для г ++ CPP для CPP файлов

и попробовать:

%.o: %.cpp 
$(CXX) $(CXXFLAGS) -c $< 
1

по умолчанию правила:

Для файлов C:

$(CC) -c $(CPPFLAGS) $(CFLAGS) $? 

Для C++ файлов

$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $? 

Для связывания:

$(CC) $(LDFLAGS) $^ $(LOADLIBES) 

CPPFLAGS должен быть предварительно процессорные флаги. Остальные два (CFLAGS CXXFLAGS) являются флагами для определенных языков. Вы должны настроить свое использование как таковое.

Также необычно exlicitly определить объектные файлы:

OBJ = main.o check.o 

Это больше обычного, чтобы определить исходные файлы. Затем определяют объектные файлы в терминах исходных файлов

OBJ = $(patsubst %.cpp, %.o, $(SRC)) 

Лично мне нравится строить все в каталоге, так что используйте

SRC = $(wildcard *.cpp) 

Но это будет зависеть многое от проекта.

+0

Спасибо! Я лично предпочитаю , что make-файлы перечисляют файлы, которые они хотят компилировать явно, а не пытаться получить их через подстановочный знак. Последнее очень подвержено ошибкам: дополнительные файлы могут существовать и быть случайно скомпилированы; файлы могут отсутствовать, а не компилироваться и т. д. Но вы правы, я должен писать исходные файлы, а не файлы объектов. patsubst очень полезно :)! –