Я предполагаю, что вы используете GNU Make, так как вы работаете в Ubuntu Linux.
Я также предполагаю, что вы опубликовали следующее:
$(TARGET):$(SRCS)
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS) $(LIBS)
неправильно отформатировано ви что ваш Makefile действительно содержит:
$(TARGET):$(SRCS)
(CC) $(CFLAGS) -o $(TARGET) $(SRCS) $(LIBS)
с отступом команды рецепта, как и должно быть.
В вашем Makefile вы считаете, что:
OPENCV = $(pkg-config opencv4 --libs --cflags)
это расширение оболочки команды pkg-config opencv4 --libs --cflags
, которое назначает вывод команды для переменной Make OPENCV
.Это не.Это просто расширение Make строки pkg-config opencv4 --libs --cflags
, как и в следующей строке:
LIBS = $(OPENCV)
$(OPENCV)
- это расширение Make переменной Make OPENCV
, а не расширение оболочкикоманда оболочки OPENCV
.
Строка pkg-config opencv4 --libs --cflags
не является переменной Make, которая имеет значение (очевидно).
Также она не может быть вызовом GNU Make-функция $(pkg-config ...)
, так как нет такой функции GNU Make.
Так что $(pkg-config opencv4 --libs --cflags)
расширяется до ничто .Следовательно:
LIBS = $(OPENCV)
заставляет $(LIBS)
расширяться до нуля, а:
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS) $(LIBS)
расширяется так же, как:
$(CC) $(CFLAGS) -o $(TARGET) $(SRCS)
, поэтому opencvбиблиотеки отсутствуют в вашей связи, и эта связь завершается ошибкой.
Чтобы назначить вывод команды оболочки переменной Make, используя функцию $(shell ...)
:
OPENCV := $(shell pkg-config opencv4 --libs --cflags)
Тогда $(OPENCV)
и $(LIBS)
получат правильное значение.
BTW ...
Обратите внимание, что ваш рецепт clean
пытается удалить файл, core
, который никогда не создается вашим Makefile.
И ..
Помните, что рецепт:
$(TARGET):$(SRCS)
(CC) $(CFLAGS) -o $(TARGET) $(SRCS) $(LIBS)
представляетв общем, самый неэффективный способ автоматизации процесса сборки программы с помощью Make, поскольку он будет перекомпилировать все N исходные файлы в $(SRCS)
всякий раз, когда вы изменяете хотя бы 1 из них.В вашем конкретном случае, опубликованном, это не имеет значения, потому что N = 1. Но когда N = 1, в Make нет необходимости.В преддверии написания более профессиональных проектов, в которых N велик, вы можете поработать с Глава 2. Введение в Makefile , по крайней мере, в руководстве по GNU Make.