Подтвердить что ты не робот

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 для одной и той же задачи.

4b9b3361

Ответ 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.)