it-swarm.com.de

Makefile zum Kompilieren von OpenCV-Code in C++ unter Ubuntu/Linux

Ich lerne OpenCV mit dem Learning OpenCV Buch.

Ein Problem, dem ich beim Kompilieren des Codes gegenüberstehe, ist, dass ich einen langen Befehl zum Kompilieren und Abrufen der ausführbaren Datei schreiben muss.

Dies ist der Befehl, den ich benutze

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

Ich bin kein Make - Experte, aber ich denke, ich kann das Schreiben dieses langen Befehls mit make ..__ aufheben. Vorher sollte ich meinen Arbeitsablauf erklären. Ich habe ein Verzeichnis namens opencv in meinem Home-Verzeichnis (~/opencv/) erstellt. Ich lese das Buch Abschnitt für Abschnitt und codiere die Beispiele oder Übungen in neue cpp-Quellcodedateien in diesem Verzeichnis. Ich kenne also die Namen der Dateien nicht.

Jetzt möchte ich machen,

Angenommen, ich habe eine neue Datei mit dem Namen facedetect.cpp in meinem opencv-Verzeichnis codiert, und wenn ich anrufe, mache ich so

make facedetect

dann möchte ich den folgenden Befehl für mich ausführen

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

wenn ich also eine neue Datei namens abc.cpp mache, werde ich make abcso ausführen, das ich ausführen kann 

$ ./abc

in meiner Befehlszeile, um meine abc.cpp zu testen

Bitte geben Sie diese make-Datei an, damit ich mir die Frustration ersparen kann, wenn Sie diesen langen Befehl jedes Mal eingeben.

PS: Ich habe in diesem Zusammenhang nach Hilfe gegoogelt und habe this über CMake gefunden. Erklären Sie bitte auch, wie ich CMake für dieselbe Aufgabe verwenden kann.

18
SPV

Sie können eine Datei mit dem Namen Makefile in Ihrem Arbeitsverzeichnis folgendermaßen erstellen:

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

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

dann können Sie diese Datei für alle Ihre Programme verwenden. Rufen Sie einfach make mit dem Basisnamen der Datei auf, die Sie kompilieren möchten. Für facedetect.cpp wäre das

make facedetect

Hier noch einige Details:

Das allgemeine Format eines Makefiles sieht folgendermaßen aus:

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

So könnten Sie für Ihr Beispiel schreiben:

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

Für jedes neue Beispiel können Sie jetzt ein neues Ziel erstellen. Sie können es aber auch allgemeiner machen:

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

Hier entspricht % einem beliebigen nicht leeren Teilstring. Die automatischen Variablen [email protected] und $< ersetzen die Namen der Zieldatei und der Quelldatei . Weitere Informationen finden Sie in der make Dokumentation .

24
sietschie

GNU Make ist ziemlich schlau und das Makefile, das Sie dafür brauchen, muss nicht so ausführlich sein wie in den anderen bisherigen Antworten. Hier ist ein einfaches Makefile, mit dem Sie die OpenCV-Beispiele zusammenstellen können:

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

Das ist es. Das Makefile kann dank der impliziten Regeln von Make so kurz sein.

Führen Sie dann make wie gewohnt aus:

make facedetect

Dies setzt voraus, dass sich in demselben Verzeichnis ein facedetect.c oder facedetect.cpp befindet.

Ich empfehle das folgende (kostenlose!) Buch, wenn Sie Make lernen möchten: http://oreilly.com/catalog/make3/book/index.csp

5
Serrano

Erstellen Sie in Ihrem Arbeitsverzeichnis eine Datei mit dem Namen makefile, die Folgendes enthält:

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

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

Wenn Sie dann kompilieren möchten, geben Sie einfach Folgendes ein:

$ make

(Um IhrePS- zu beantworten, beachten Sie, dass CMake sich sehr von make unterscheidet - für den Moment sollten Sie make verwenden.)

0
Paul R