Простой Makefile с использованием WiringPi

Я новичок в 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

0

Решение

Это сообщение означает, что 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
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]