Я новичок в Makefiles. Я делал простую библиотеку C ++, используя WiringPi для моих проектов, связанных с RaspberyPi. Пока что все очень просто с такими вещами, как класс светодиодов, дуэль, мотор, кнопка и т. Д. (Как .h, так и .cpp). Я смог собрать Makefile, но получаю ошибку Msgstr «Нет правила, чтобы сделать целевой RumPi.o необходимым для RumPi». (Примечание: название моей библиотеки называется RumPi)
Спасибо за помощь, вот последнее исправление:
CXX = g++
CXXFLAGS = -std=c++11
LDLIBS = -lwiringPi
HEADERS = Components/Headers/RumPi.h ./Common.h Components/Headers/Component.h Components/Headers/Vehicle.h Components/Headers/Motor.h Components/Headers/Receiver.h Components/Headers/DualLED.h Components/Headers/LED.h Components/Headers/RGBLED.h Components/Headers/Relay.h
OBJECTS = RumPi.o Vehicle.o Motor.o Receiver.o DualLED.o LED.o RGBLED.o Relay.o
default: RumPi
RumPi: $(OBJECTS)
$(CXX) $(CXXFLAGS) $^ $(LDLIBS) -o $@
%.o: Components/Implementations/%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(OBJECTS): $(HEADERS)
clean:
-rm -f $(OBJECTS)
-rm -f RumPi
Это сообщение означает, что make не может понять, как создать эту цель (RumPi.o
). У вас есть Components/Implementations/RumPi.cpp
файл? Сделайте все файлы заголовков, которые вы перечислили в $(HEADERS)
переменная действительно существует? Если что-то из этого не соответствует действительности, то ваше шаблонное правило не будет совпадать. Если ваше правило шаблона не соответствует (и правило по умолчанию не соответствует), то make не может понять, как создать объектный файл.
Если вы хотите получить полную информацию, вы можете запустить make -d
и проверьте выходные данные отладки. Возможно, вы захотите перенаправить его в файл, чтобы вы могли посмотреть на него с less
или текстовый редактор, так как есть много выходных данных.
Кстати, вы не должны добавлять -lwiringPi
вариант вашей строки компиляции. Библиотеки используются только во время компоновки, а не во время компиляции.
расчетное время прибытия
Что-то еще, что вы должны рассмотреть, это переписать правило шаблона, чтобы в качестве предварительного условия был указан только исходный файл, и переместить заголовки в отдельную строку:
%.o: Components/Implementations/%.cpp
gcc -c $< -o $@ -lwiringPi
$(OBJECTS): $(HEADERS)
Преимущество этого заключается в том, что вы получите более четкое сообщение об ошибке, если один из заголовков не найден. Когда вы используете шаблонное правило, make попытается найти соответствие все паттерны, которые он может, и если ни один из них не соответствует, он говорит вам, что не знает, как построить цель. Поскольку обычно существует много разных способов создания цели, make не показывает ошибку для каждого, который не соответствует.
Но если вы объявите прямой явный обязательное отношение между двумя файлами, а не использование шаблона, который может совпадать или не совпадать, тогда, если отсутствует файл, make сообщит вам об этом напрямую.
ETA2
В вашем оригинальном make-файле у вас было такое правило:
RumPi: $(OBJECTS)
gcc $(OBJECTS) -o $@ -lwiringPi
но потом ты это убрал. Почему ты это вынул? Вам нужно это правило, чтобы указать make, как связать ваш исполняемый файл RumPi
,
Кроме того, вы не должны использовать gcc
как компилятор / компоновщик для кода C ++; gcc
для C, а не C ++. Вы должны использовать g++
для кода C ++. И лучше всего хранить эту информацию в переменных, чтобы ее было легко найти и изменить (даже из командной строки, если хотите). Стандартные имена переменных для компилятора C ++ CXX
и т.п.
Ваш make-файл должен выглядеть примерно так:
CXX = g++
CXXFLAGS = -std=c++11
LDLIBS = -lwiringPi
HEADERS = Components/Headers/RumPi.h ./Common.h Components/Headers/Component.h \
Components/Headers/Vehicle.h Components/Headers/Motor.h Components/Headers/Receiver.h \
Components/Headers/DualLED.h Components/Headers/LED.h Components/Headers/RGBLED.h \
Components/Headers/Relay.h
OBJECTS = RumPi.o Vehicle.o Motor.o Receiver.o DualLED.o LED.o RGBLED.o Relay.o
default: RumPi
RumPi: $(OBJECTS)
$(CXX) $(CXXFLAGS) $^ $(LDLIBS) -o $@
%.o: Components/Implementations/%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
$(OBJECTS): $(HEADERS)
clean:
-rm -f $(OBJECTS)
-rm -f RumPi
Других решений пока нет …