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 abc
so 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.
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 .
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
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.)