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