2012-03-26 26 views
18

Sto imparando OpenCV utilizzando il libro Learning OpenCV.Makefile per compilare codice OpenCV in C++ su Ubuntu/Linux

Un problema che sto affrontando durante la compilazione del codice è che devo scrivere un comando lungo per compilare e ottenere l'eseguibile.

Questo è il comando che sto usando

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

Io non sono Fai esperto, ma credo di poter eliminare per iscritto che a lungo comando utilizzando fanno. Prima dovrei spiegare il mio flusso di lavoro. Ho creato una directory chiamata opencv nella mia home directory (~/opencv/). Sto leggendo la sezione del libro per sezione e codificando gli esempi o gli esercizi in nuovi file di codice sorgente cpp in quella directory. Quindi non conosco i nomi dei file prima mano.

Ora quello che voglio fare fare è,

Supponiamo che io ho codificato un nuovo file chiamato facedetect.cpp nella mia directory opencv, e se io chiamo fare come questo

make facedetect 

poi voglio fare per eseguire il seguente comando per me

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

modo che ogni volta che faccio un nuovo file chiamato abc.cpp, io exe carino make abc in modo che possa funzionare

$ ./abc 

al mio riga di comando per testare il mio abc.cpp

Si prega di dare che rendono file in modo che io possa salvare la frustrazione di digitare quel comando tempo ogni volta.

PS: Ho Googled per un aiuto su questo e trovato this sull'utilizzo CMake ma non riuscivo a capire che cosa che fa. Si prega di spiegare anche come posso usare CMake per lo stesso compito.

risposta

22

È possibile creare un file chiamato Makefile in voi la directory di lavoro in questo modo:

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

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

quindi è possibile utilizzare questo file per tutti i vostri programms singolo file.Basta chiamare lo make con il nome base del file che si desidera compilare. Per facedetect.cpp che sarebbe

make facedetect 

Ecco qualche dettaglio in più:

Il formato generale di un makefile è come questo:

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

Quindi per la vostra esempio si potrebbe scrivere:

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

Per ogni nuovo esempio è ora possibile creare un nuovo obiettivo. Ma si può anche rendere più generale:

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

Qui % corrisponde a qualsiasi stringa non vuota. Le variabili automatiche [email protected] e $< sostituiscono i nomi del file di destinazione e del file di origine. Per maggiori informazioni è possibile consultare lo make documentation.

+8

Sembra che solo 'g ++ $ (CFLAGS) -o $ @ $ <$ (LIBS)' funzionerà. Ma penso che sia una cosa da vedere. Grazie per il Makefile. Puoi spiegare cosa significa o dare una buona risorsa per imparare a fare Make – SPV

+0

Buone risorse sul make: [make manual] (http://www.gnu.org/software/make/manual/make.html). Non è così spaventoso e difficile da capire come sembra. – morynicz

+3

Grazie a Siva Prasad Varma, era davvero l'ordine ** degli argomenti. '$ (LIBS)' ** deve andare alla fine del comando di compilazione **, altrimenti gli esempi OpenCV non verranno compilati! – cosimo

0

creare un file denominato makefile nella directory di lavoro che contiene il seguente:

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

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

Poi, quando si desidera compilare basta digitare:

$ make 

(per rispondere alla tua PS - nota che CMake è molto diverso da make - per ora dovresti usare solo make.)

5

GNU Make è piuttosto intelligente e il Makefile necessario per questo non ha bisogno di essere dettagliato come nelle altre risposte fornite finora. Ecco un semplice Makefile che è possibile utilizzare per compilare gli esempi OpenCV:

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

Questo è tutto. Il Makefile può essere così breve grazie a Make's implicit rules.

Poi gestita make come al solito:

make facedetect 

Questo presuppone c'è un facedetect.c o facedetect.cpp nella stessa directory.

vi consiglio il seguente (gratis!) Libro, se volete imparare Costruttore: http://oreilly.com/catalog/make3/book/index.csp

+0

oggi, puoi semplicemente installare cmake (se non già installato => sudo apt-get install cmake); aprire un terminale; navigare nella cartella opencv; cmake.; rendere; nota il punto "." (punto) dopo cmake, ora aspetta che tutto sia costruito – ComputerSaysNo

+1

@ComputerSaysNo: Penso che tu abbia frainteso la domanda. Non sta cercando di compilare OpenCV, ma i file sorgente che ha scritto lui stesso da esercizi in un libro (che usano le librerie OpenCV). – Serrano

+0

ahhh, sì, incompreso male, mi dispiace – ComputerSaysNo

Problemi correlati