Из вашего примера похоже, что у вас не активировано правило Makefile для компиляции файлов C ++. Может быть, ваши %
неправильно расширяются?
Попробуйте
$(OBJECTS): %.o: %.cpp
...
И укажите пункт назначения в части правила, используя $(basename ..)
, где это необходимо.
Это работает для C для blue.c
, потому что в Make есть встроенное правило по умолчанию для компиляции C-файлов. Я подозреваю, что запуск Make с параметром --no-builtin-rules
приведет к тому, что файл blue.c
также перестанет работать.
Из документов
Компиляция программ на C
n.o автоматически создается из n.c с помощью команды вида $(CC) -c
$(CPPFLAGS) $(CFLAGS)'. Compiling C++
programs
n.o is made automatically from n.cc, n.cpp, or n.C with a command of
the form
$ (CXX) -c $ (CPPFLAGS)
$ (CXXFLAGS). Мы рекомендуем вам использовать
суффикс .cc' for C++ source files
instead of
.C '.
Там является правилом C ++ по умолчанию, но оно может не сработать из-за другого правила или плохих переменных. Лучше написать правило явно, чтобы быть уверенным.
Вам нужно правило, такое как:
%.o: %.cpp
$(CPP) $(CPP_OPTS) -c -o $@ $<
Для компиляции ваших объектных файлов из исходного кода, у вас есть:
executable: $(OBJECTS)
... compile objects into final blob ...
Где объекты какого-либо формата %.o
вызывают зависимость. Или используйте Autotools / Autoconf , чтобы создать свой Makefile для вас. Вот пример, который я написал, который просто собирает файлы C ++ в каталог объектов:
SOURCES=$(wildcard path/to/src/*.cpp)
OBJECTS=$(SOURCES: .cpp=.o)
CC=g++
final: $(OBJECTS)
mv $(OBJECTS) /path/to/build_dir
%.o: %.cpp:
g++ -c -o $@ $<
Ни в коем случае не полный пример, но вы поняли идею. В правиле final
вы копируете объектные файлы, но вы можете сделать что угодно здесь или изменить параметр -o
, чтобы подключать файлы сборки в определенном месте.