Makefile для компиляции кода OpenCV в С++ на Ubuntu/Linux
Я изучаю OpenCV, используя Обучение OpenCV.
Одна проблема, с которой я сталкиваюсь при компиляции кода, заключается в том, что мне приходится писать длинную команду для компиляции и получения исполняемого файла.
Это команда, которую я использую
g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv`
Я не эксперт Make, но я думаю, что могу удалить эту длинную команду, используя make.
До этого я должен объяснить свой рабочий процесс. Я создал директорию opencv в моем домашнем каталоге (~/opencv/
). Я читаю раздел книги по разделам и кодирую примеры или упражнения в новые файлы исходного кода cpp в этом каталоге. Поэтому я не знаю имена файлов перед началом работы.
Теперь я хочу сделать,
Предположим, что я закодировал новый файл с именем facedetect.cpp
в моей директории opencv
, и, если я позвоню, сделайте так:
make facedetect
тогда я хочу сделать для выполнения следующей команды для меня
g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv`
так что всякий раз, когда я создаю новый файл с именем abc.cpp, я буду выполнять make abc
так что я могу запустить
$ ./abc
в моей командной строке для проверки моего abc.cpp
Пожалуйста, дайте этот файл make, чтобы я мог сохранить разочарование в том, чтобы печатать эту длинную команду каждый раз.
PS: У меня есть Googled для получения справки об этом и нашел this в использовании CMake, но я не мог понять что это делает. Пожалуйста, также объясните, как я могу использовать CMake для одной и той же задачи.
Ответы
Ответ 1
Вы можете создать файл с именем Makefile
в вашем рабочем каталоге следующим образом:
CFLAGS = `pkg-config --cflags opencv`
LIBS = `pkg-config --libs opencv`
% : %.cpp
g++ $(CFLAGS) $(LIBS) -o [email protected] $<
то вы можете использовать этот файл для всех ваших однопрограммных программ. Просто позвоните make
с базовым именем файла, который вы хотите скомпилировать. Для facedetect.cpp
, который был бы
make facedetect
Вот еще несколько деталей:
Общий формат make файла выглядит следующим образом:
target : dependecy1 dependenc2 ...
command that generates the target
Итак, для вашего примера вы можете написать:
facedetect : facedetect.cpp
g++ $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp
Для каждого нового примера вы можете создать новую цель. Но вы также можете сделать его более общим:
% : %.cpp
g++ $(CFLAGS) $(LIBS) -o [email protected] $<
Здесь %
соответствует любой непустой подстроке. Автоматические переменные [email protected]
и $<
заменяют имена целевого файла и исходного файла.
Для получения дополнительной информации вы можете обратиться к сделать документацию.
Ответ 2
GNU Make довольно умный, и Makefile, который вам нужен для этого, не обязательно должен быть таким же подробным, как в других ответах, данных до сих пор. Вот простой Makefile, который вы можете использовать для компиляции примеров OpenCV:
CPPFLAGS = $(shell pkg-config --cflags opencv)
LDLIBS = $(shell pkg-config --libs opencv)
Что это. Makefile может быть таким коротким благодаря Make неявные правила.
Затем запустите make
, как обычно:
make facedetect
Предполагается, что в этом же каталоге есть facedetect.c
или facedetect.cpp
.
Я рекомендую следующую (бесплатную!) книгу, если вы хотите узнать Make: http://oreilly.com/catalog/make3/book/index.csp
Ответ 3
Создайте файл с именем makefile
в вашем рабочем каталоге, который содержит следующее:
CFLAGS = $SHELL(pkg-config --cflags opencv)
LIBS = $SHELL(pkg-config --libs opencv)
facedetect : facedetect.cpp
g++ $(CFLAGS) $(LIBS) -o [email protected] $<
Затем, когда вы хотите скомпилировать, просто введите:
$ make
(Чтобы ответить на ваш PS - обратите внимание, что CMake
сильно отличается от make
- на данный момент вам нужно просто использовать make
.)