Makefile do kompilacji kodu OpenCV w C++ na Ubuntu/Linux

OpenCV jest jednym z najbardziej popularnych programów na świecie.

Problem, z którym borykam się podczas kompilacji kodu polega na tym, że muszę napisać długie polecenie, aby skompilować i uzyskać plik wykonywalny.

To jest komenda, której używam

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

Nie jestem ekspertem Make , ale myślę, że mogę wyeliminować pisanie długich poleceń za pomocą make . Wcześniej powinienem wyjaśnić mój przepływ pracy. Utworzyłem katalog o nazwie opencv w moim katalogu domowym (~/opencv/). Jestem czytanie sekcji książki po sekcji i kodowanie przykładów lub ćwiczeń do nowych plików kodu źródłowego cpp w tym katalogu. więc nie znam nazw plików przed ręką.

Teraz chcę zrobić to,

Załóżmy, że zakodowałem nowy plik o nazwie facedetect.cpp w moim katalogu opencv i jeśli wywołam make w ten sposób

make facedetect

Następnie chcę make wykonać następujące polecenie dla mnie

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

Tak, że ilekroć tworzę nowy plik o nazwie abc.cpp, wykonam make abc żebym mógł biegać

$ ./abc

W moim wierszu poleceń, aby przetestować moje abc.cpp

Proszę podać ten plik make, abym mógł zapisać frustrację związaną z wpisywaniem tej długiej komendy za każdym razem.

PS: poszukałem pomocy w tym temacie i znalazłem to naCMake ale nie mogłem zrozumieć, co to robi. Uprzejmie również wyjaśnić, jak mogę użyć CMake do tego samego zadania.

Author: Pranit Bauva, 2012-03-26

3 answers

Możesz utworzyć w swoim katalogu roboczym plik o nazwie Makefile w następujący sposób:

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

% : %.cpp
        g++ $(CFLAGS) $(LIBS) -o $@ $<

Następnie możesz użyć tego pliku dla wszystkich programów z pojedynczymi plikami. Po prostu wywołaj make z nazwą bazową pliku, który chcesz skompilować. For facedetect.cpp that would be

make facedetect

Tutaj kilka szczegółów:

Ogólny format pliku makefile wygląda następująco:

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

Więc dla przykładu możesz napisać:

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

Dla każdego nowego przykładu można teraz utworzyć nowy cel. Ale ty można też uczynić go bardziej ogólnym:

% : %.cpp
    g++  $(CFLAGS) $(LIBS) -o $@ $<

Tutaj % pasuje do dowolnego fragmentu. Zmienne automatyczne $@ i $< zastępują nazwy pliku docelowego i pliku źródłowego. Więcej informacji można znaleźć w make documentation.

 24
Author: sietschie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 15:53:57

GNU Make jest całkiem sprytny, a plik Makefile, którego potrzebujesz, nie musi być tak gadatliwy, jak w innych odpowiedziach podanych do tej pory. Oto prosty plik Makefile, którego możesz użyć do skompilowania przykładów OpenCV:

CPPFLAGS = $(shell pkg-config --cflags opencv)
LDLIBS = $(shell pkg-config --libs opencv)
To wszystko. Plik Makefile może być tak krótki dzięki niejawnym zasadom Make .

Następnie uruchom {[2] } Jak zwykle:

make facedetect

Zakłada to, że w tym samym katalogu znajduje się facedetect.c lub facedetect.cpp.

Polecam (gratis!) zarezerwuj, jeśli chcesz dowiedz się Marka: http://oreilly.com/catalog/make3/book/index.csp
 5
Author: Serrano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 11:28:48

Utwórz plik o nazwie makefile w katalogu roboczym, który zawiera:

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

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

Następnie, gdy chcesz skompilować wystarczy wpisać:

$ make

(aby odpowiedzieć na twoje PS - zauważ, że CMake bardzo różni się od make - na razie powinieneś użyć make.)

 0
Author: Paul R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-26 10:23:31