Makefile для компиляции кода OpenCV в C ++ в Ubuntu / Linux - PullRequest
18 голосов
/ 26 марта 2012

Я изучаю OpenCV, используя Обучение OpenCV book.

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

Это команда, которую я использую

g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv`

Я не Создаю эксперт, но я думаю, что могу исключить написание этой длинной команды, используя make . Перед этим я должен объяснить мой рабочий процесс. Я создал каталог с именем opencv в моем домашнем каталоге (~/opencv/). Я читаю книгу раздел за разделом и кодирую примеры или упражнения в новые файлы исходного кода cpp в этом каталоге. Так что я не знаю имен файлов до этого.

Теперь, что я хочу сделать, это,

Предположим, я закодировал новый файл с именем facedetect.cpp в моей директории opencv, и если я вызову make, то вот так

make facedetect

тогда я хочу, чтобы make выполнил для меня следующую команду

g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv`

чтобы каждый раз, когда я создавал новый файл с именем abc.cpp, я выполнял make abc чтобы я мог бежать

$ ./abc

в моей командной строке для проверки моего abc.cpp

Пожалуйста, дайте этот make-файл, чтобы я мог избежать разочарования от ввода этой длинной команды каждый раз.

PS: Я помог Google по этому вопросу и обнаружил это при использовании CMake , но я не мог понять, что это делает. Просьба также объяснить, как я могу использовать CMake для той же задачи.

Ответы [ 3 ]

24 голосов
/ 26 марта 2012

Вы можете создать файл с именем Makefile в вашем рабочем каталоге следующим образом:

CFLAGS = `pkg-config --cflags opencv`
LIBS = `pkg-config --libs opencv`

% : %.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<

, затем вы можете использовать этот файл для всех ваших однофайловых программ.Просто наберите make с базовым именем файла, который вы хотите скомпилировать.Для facedetect.cpp это будет

make facedetect

Вот еще несколько деталей:

Общий формат файла сборки выглядит так:

target : dependecy1 dependenc2 ...
    command that generates the target

Так что для вашего примераВы можете написать:

facedetect : facedetect.cpp
    g++  $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp

Для каждого нового примера вы можете создать новую цель.Но вы также можете сделать его более общим:

% : %.cpp
    g++  $(CFLAGS) $(LIBS) -o $@ $<

Здесь % соответствует любой непустой подстроке.Автоматические переменные $@ и $< заменяют имена целевого файла и исходного файла.Для получения дополнительной информации вы можете обратиться к документации make .

5 голосов
/ 23 мая 2014

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 в том же каталоге.

Я рекомендую следующую (бесплатную!) Книгу, если вы хотите изучать Марку: http://oreilly.com/catalog/make3/book/index.csp

0 голосов
/ 26 марта 2012

Создайте файл с именем makefile в вашем рабочем каталоге, который содержит следующее:

CFLAGS = $SHELL(pkg-config --cflags opencv)
LIBS = $SHELL(pkg-config --libs opencv)

facedetect : facedetect.cpp
    g++ $(CFLAGS) $(LIBS) -o $@ $<

Затем, когда вы хотите скомпилировать, просто наберите:

$ make

(Чтобы ответитьваш PS - обратите внимание, что CMake очень отличается от make - на данный момент вы должны, вероятно, просто использовать make.)

...