2012-03-26 3 views
18

Я изучаю OpenCV, используя Learning OpenCV книгу.Makefile для компиляции кода OpenCV в C++ на Ubuntu/Linux

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

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

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

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

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

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

make facedetect 

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

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

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

$ ./abc 

в моей командной строке, чтобы проверить мой abc.cpp

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

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

ответ

22

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

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

% : %.cpp 
     g++ $(CFLAGS) $(LIBS) -o [email protected] $< 

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

make facedetect 

Вот еще некоторые детали:

Общий формат Makefile таков:

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] и $< заменяют имена целевого файла и исходного файла. Для получения дополнительной информации вы можете обратиться к make documentation.

+8

Похоже, только 'г ++ $ (CFLAGS) -o $ @ $ <$ (LIBS)' будет работать. Но я думаю, что это непростая вещь. Спасибо за Makefile. Можете ли вы объяснить, что это значит или дать хороший ресурс, чтобы узнать о Make – SPV

+0

Хорошие ресурсы о make: [make manual] (http://www.gnu.org/software/make/manual/make.html). Это не так страшно и трудно понять, как кажется. – morynicz

+3

Спасибо Siva Prasad Varma, это был действительно порядок ** аргументов. '$ (LIBS)' ** должен идти в конце команды компиляции **, или сами примеры OpenCV не будут компилироваться! – cosimo

0

Создайте файл с именем 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 - пока вы должны probaby просто использовать make.)

5

GNU Make довольно умный, и Makefile, который вам нужен для этого, не обязательно должен быть таким же подробным, как и в других ответах, данных до сих пор. Вот простой Makefile, который вы можете использовать для компиляции примеров OpenCV:

CPPFLAGS = $(shell pkg-config --cflags opencv) 
LDLIBS = $(shell pkg-config --libs opencv) 

Вот и все. Makefile может быть таким коротким благодаря Make's implicit rules.

Затем запустите make как обычно:

make facedetect 

Это предполагает, что есть facedetect.c или facedetect.cpp в том же каталоге.

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

+0

Сегодня вы можете просто установить cmake (если еще не установлен => sudo apt-get install cmake); открыть терминал; перейдите в папку opencv; cmake.; делать; обратите внимание на «.» (точка) после cmake, теперь подождите, пока все будет построено. – ComputerSaysNo

+1

@ComputerSaysNo: Я думаю, вы неправильно поняли этот вопрос. Он не пытается скомпилировать OpenCV, а исходные файлы, которые он написал себе из упражнений в книге (которые используют библиотеки OpenCV). – Serrano

+0

ahhh, да, неправильно поняли, извините – ComputerSaysNo

Смежные вопросы