lock&_lock Ответов: 1

Makefile для программы на C++ с opencv ?


Я попытался скомпилировать свою программу в терминале. Это прекрасно работает таким образом. Но теперь у меня есть несколько файлов, и я предпочел бы использовать makefile вместо этого, я попытался создать makefile для моей программы c++, но я столкнулся с ошибкой "файл opencv2/opencv.hpp не найден". Но я могу правильно скомпилировать первый метод (вручную) и потерпел неудачу с Makefile. Что я сделал не так с моим файлом makefile ? спасибо

Что я уже пробовал:

вот как я вручную компилирую его один за другим :

g++ $(pkg-config --cflags --libs opencv4) -std=c++11  one.cpp -o one


и вот как я создаю свой Makefile, где я получил ошибку библиотеки :
BIN_DIR= .
CC = g++
CFLAGS = -std=c++11

OPENCV = pkg-config --cflags --libs opencv4
LIBS = $(OPENCV)

all: $(BIN_DIR)/one $(BIN_DIR)/two

$(BIN_DIR)/one: one.o
    ${CC} -o $(BIN_DIR)/one one.o $(LIBS)

$(BIN_DIR)/two: two.o
    ${CC} -o $(BIN_DIR)/two two.o $(LIBS)

one.o: one.cpp
    ${CC} $(CFLAGS) -c one.cpp

two.o: two.cpp
    ${CC} $(CFLAGS) -c two.cpp

clean:
    rm -f *.o
    rm -f $(BIN_DIR)/one
    rm -f $(BIN_DIR)/two

allclean:
    rm -f *.o
    rm -f $(BIN_DIR)/one
    rm -f $(BIN_DIR)/two
    rm -f Makefile

Richard MacCutchan

Вам нужно задать переменную для расположения заголовочных файлов opencv, чтобы компилятор знал, где ее найти.

1 Ответов

Рейтинг:
10

k5054

Линия

OPENCV = pkg-config --cflags --libs opencv4
не оценивает команду, для этого вам нужно обернуть с помощью $(shell ...) Кроме того, вам нужно сообщить компилятору для каждого модуля, где найти включаемые файлы для opencv. Я думаю, что следующее должно сделать трюк.
CFLAGS = -std=c++11 $(shell pkg-config --cflags opencv4)
LIBS = $(shell pkg-config --libs opencv4)


lock&_lock

О, я вижу, ваше решение работает, спасибо !

k5054

Просто краткое Примечание - make действительно имеет неявные правила для компиляции и связывания источников c++. Компилятором C++ по умолчанию является CXX, который использует переменную CXXFLAGS для передачи компилятору определенных флагов C++. Если бы у вас был файл Makefile, который выглядел бы так

CXXFLAGS = -std=c++11 $(shell pkg-config --cflags opencv4)
LDLIBS=$(shell pkg-config --libs opencv4)

Тогда вы могли бы скомпилировать one.cpp к исполняемому файлу, сказав: сделать один Обратите внимание, что make не знает, что несколько файлов . o из источников C++ должны быть связаны с libstdc++, поэтому вам все равно нужно сообщить make, что он должен использовать компилятор C++ для связи . В этом случае ваша цель может быть упрощена до
foo: foo.o bar.o baz.o
        $(CXX) $^ $(LDFLAGS) -o $@

Это создаст foo.o, bar.o и baz.o из foo.cpp, bar.cpp и еще baz.cpp по мере необходимости, а затем свяжите их все вместе с исполняемым файлом foo.

lock&_lock

о, так вот как я это делаю вместо того, чтобы делать это один за другим ! Это гениально ! Я не знал об этом методе. Я попробую, еще раз спасибо !