I am learning OpenCV using Learning OpenCV book.
One problem I am facing while compiling the code is that I have to write a long command to compile and get the executable.
This is the command I am using
g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv`
I am no Make expert but I think I can eliminate writing that long command using make.
Before that I should explain my work flow. I have created a directory called opencv in my home directory (~/opencv/
). I am reading the book section by section and coding the examples or exercises into new cpp source code files in that directory. So I don't know the names of the files before hand.
Now what I want make to do is,
Suppose I have coded a new file named facedetect.cpp
in my opencv
directory, and if I call make like this
make facedetect
then I want make to execute the following command for me
g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv`
so that whenever I make a new file named abc.cpp, I will execute make abc
so that I can run
$ ./abc
at my command line to test my abc.cpp
Please give that make file so that I can save the frustration of typing that long command each time.
PS: I have Googled for help on this and found this on using CMake but I could not understand what that does. Kindly also explain how can I use CMake for the same task.
GNU Make is pretty smart and the Makefile you need for this doesn't need to be as verbose as in the other answers given so far. Here is a simple Makefile which you can use to compile the OpenCV examples:
That's it. The Makefile can be this short thanks to Make's implicit rules.
Then run
make
as usual:This assumes there is a
facedetect.c
orfacedetect.cpp
in the same directory.I recommend the following (free!) book if you want to learn Make: http://oreilly.com/catalog/make3/book/index.csp
You can create a file called
Makefile
in you working directory like this:then you can use this file for all your single-file programms. Just call
make
with the basename of the file you want to compile. Forfacedetect.cpp
that would beHere some more details:
The general format of a makefile is like this:
So for your example you could write:
For each new example you can now create a new target. But you can also make it more general:
Here
%
matches any nonempty substring. The automatic variables$@
and$<
substitute the names of the target file and the source file. For more information you can consult the make documentation.Create a file named
makefile
in your working directory that contains the following:Then when you want to compile you just type:
(To answer your PS - note that
CMake
is very different frommake
- for now you should probaby just usemake
.)