2012-03-26 27 views
18

Estoy aprendiendo OpenCV usando Learning OpenCV libro.Makefile para compilar código de OpenCV en C++ en Ubuntu/Linux

Un problema que enfrento al compilar el código es que tengo que escribir un comando largo para compilar y obtener el ejecutable.

Este es el comando que estoy utilizando

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

no soy Hacer experto pero creo que puedo eliminar escribir ese comando largo usando hacen. Antes de eso, debería explicar mi flujo de trabajo. He creado un directorio llamado opencv en mi directorio personal (~/opencv/). Estoy leyendo el libro sección por sección y codificando los ejemplos o ejercicios en nuevos archivos de código fuente cpp en ese directorio. Así que no sé los nombres de los archivos antes de la mano.

Ahora lo que quiero hacer que hacer es,

Suponga que he codificado un nuevo archivo llamado facedetect.cpp en mi directorio opencv, y si llamo a hacer como esto

make facedetect 

entonces quiero hacer para ejecutar el siguiente comando para mí

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

para que cada vez que hago un nuevo archivo llamado abc.cpp, voy a ejecutar linda make abc para que pueda funcionar

$ ./abc 

en mi línea de comandos para probar mi abc.cpp

Por favor de hacer que el archivo para que pueda salvar a la frustración de escribir ese comando tiempo cada vez.

PD: He buscado en Google en busca de ayuda en esto y encontrado this sobre el uso de CMake pero no podía entender lo que hace. Amablemente también explique cómo puedo usar CMake para la misma tarea.

Respuesta

22

Se puede crear un archivo llamado Makefile en que directorio de trabajo así:

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

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

continuación, puede utilizar este archivo para todas sus Programms de un solo archivo.Simplemente llame al make con el nombre base del archivo que desea compilar. Para facedetect.cpp que sería

make facedetect 

Aquí algunos detalles más:

El formato general de un makefile es así:

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

Así que para su ejemplo, usted podría escribir:

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

Para cada nuevo ejemplo, ahora puede crear un nuevo objetivo. Pero también se puede hacer que sea más general:

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

Aquí % coincide con cualquier subcadena no vacía. Las variables automáticas [email protected] y $< sustituyen los nombres del archivo de destino y el archivo de origen. Para obtener más información puede consultar el make documentation.

+8

Parece que solamente 'g ++ $ (CFLAGS) -o $ @ $ <$ (LIBS)' va a funcionar. Pero creo que es una cosa abierta. Gracias por el Makefile. ¿Puede explicar qué significa eso o dar un buen recurso para aprender sobre Make – SPV

+0

? Buenos recursos sobre make: [make manual] (http://www.gnu.org/software/make/manual/make.html). No es tan aterrador y difícil de entender como parece. – morynicz

+3

Gracias Siva Prasad Varma, de hecho fue el ** orden ** de los argumentos. '$ (LIBS)' ** debe ir al final del comando de compilación **, ¡o los ejemplos de OpenCV no se compilarán! – cosimo

0

Crear un archivo llamado makefile en su directorio de trabajo que contiene lo siguiente:

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

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

Luego, cuando se desea compilar sólo tiene que teclear:

$ make 

(Para responder a su PS - tenga en cuenta que CMake es muy diferente de make - por ahora debería usar make)

5

GNU make es bastante inteligente y el Makefile que necesita para esto no necesita ser tan detallado como en las otras respuestas dadas hasta ahora. Aquí hay un Makefile simple que puede usar para compilar los ejemplos de OpenCV:

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

Eso es todo. El Makefile puede ser tan corto gracias a Make's implicit rules.

A continuación, ejecute make como de costumbre:

make facedetect 

Esto supone que hay una facedetect.c o facedetect.cpp en el mismo directorio.

recomiendo el libro siguiente (gratis!) Si quieres aprender Marca: http://oreilly.com/catalog/make3/book/index.csp

+0

hoy, simplemente puede instalar cmake (si no está ya instalado => sudo apt-get install cmake); abrir una terminal; navegar a la carpeta opencv; cmake. hacer; tenga en cuenta el "." (punto) después de cmake, ahora, espere a que se construya todo – ComputerSaysNo

+1

@ComputerSaysNo: Creo que ha entendido mal la pregunta. No está tratando de compilar OpenCV, sino archivos de origen que él mismo escribió a partir de ejercicios en un libro (que usan las bibliotecas de OpenCV). – Serrano

+0

ahhh, sí, mal entendido mal, lo siento – ComputerSaysNo

Cuestiones relacionadas