J'apprends OpenCV avec Learning OpenCV book.
Un problème auquel je suis confronté lors de la compilation du code est que je dois écrire une longue commande pour compiler et obtenir le fichier exécutable.
C'est la commande que j'utilise
g++ `pkg-config –cflags opencv` file_name.cpp -o output_file `pkg-config –libs opencv`
Je ne suis pas un expert mais je pense que je peux éliminer l'écriture de cette longue commande à l'aide de make . Avant cela, je devrais expliquer mon déroulement du travail. J'ai créé un répertoire appelé opencv dans mon répertoire personnel (~/opencv/
). Je lis le livre section par section et je code les exemples ou exercices dans les nouveaux fichiers de code source cpp de ce répertoire. _ {Je ne connais donc pas les noms des fichiers à l'avance.} _
Maintenant, ce que je veux faire, c'est
Supposons que j'ai codé un nouveau fichier nommé facedetect.cpp
dans mon répertoire opencv
, et si j'appelle make comme ceci
make facedetect
alors je veux faire exécuter la commande suivante pour moi
g++ `pkg-config --cflags opencv` facedetect.cpp -o facedetect `pkg-config --libs opencv`
afin que chaque fois que je crée un nouveau fichier nommé abc.cpp, j'exécute le make abc
so que je puisse exécuter
$ ./abc
sur ma ligne de commande pour tester mon abc.cpp
S'il vous plaît donner ce fichier make afin que je puisse éviter la frustration de taper cette longue commande à chaque fois.
PS: J'ai cherché sur Google pour obtenir de l'aide et j'ai trouvé this en utilisant CMake mais je ne comprenais pas ce que cela faisait. Veuillez également expliquer comment utiliser CMake pour la même tâche.
Vous pouvez créer un fichier appelé Makefile
dans votre répertoire de travail comme ceci:
CFLAGS = `pkg-config --cflags opencv`
LIBS = `pkg-config --libs opencv`
% : %.cpp
g++ $(CFLAGS) $(LIBS) -o $@ $<
alors vous pouvez utiliser ce fichier pour tous vos programmes mono-fichier. Appelez simplement make
avec le nom de base du fichier que vous voulez compiler. Pour facedetect.cpp
ce serait
make facedetect
Voici quelques détails supplémentaires:
Le format général d'un makefile est le suivant:
target : dependecy1 dependenc2 ...
command that generates the target
Donc, pour votre exemple, vous pouvez écrire:
facedetect : facedetect.cpp
g++ $(CFLAGS) $(LIBS) -o facedetect facedetect.cpp
Pour chaque nouvel exemple, vous pouvez maintenant créer une nouvelle cible. Mais vous pouvez aussi le rendre plus général:
% : %.cpp
g++ $(CFLAGS) $(LIBS) -o $@ $<
Ici, %
correspond à toute sous-chaîne non vide. Les variables automatiques $@
et $<
remplacent les noms du fichier cible et du fichier source . Pour plus d'informations, vous pouvez consulter le make documentation .
GNU Make est assez intelligent et le Makefile dont vous avez besoin pour cela n'a pas besoin d'être aussi détaillé que dans les autres réponses données jusqu'à présent. Voici un Makefile simple que vous pouvez utiliser pour compiler les exemples OpenCV:
CPPFLAGS = $(Shell pkg-config --cflags opencv)
LDLIBS = $(Shell pkg-config --libs opencv)
C'est tout. Le Makefile peut être aussi court grâce aux règles implicites de Make .
Puis lancez make
comme d'habitude:
make facedetect
Cela suppose qu'il existe un facedetect.c
ou facedetect.cpp
dans le même répertoire.
Je recommande le livre suivant (gratuit!) Si vous souhaitez apprendre le type: http://oreilly.com/catalog/make3/book/index.csp
Créez un fichier nommé makefile
dans votre répertoire de travail contenant les éléments suivants:
CFLAGS = $Shell(pkg-config --cflags opencv)
LIBS = $Shell(pkg-config --libs opencv)
facedetect : facedetect.cpp
g++ $(CFLAGS) $(LIBS) -o $@ $<
Ensuite, lorsque vous voulez compiler, il vous suffit de taper:
$ make
(Pour répondre à votrePS- notez que CMake
est très différent de make
- pour le moment, vous devriez utiliser probabulaire, juste make
.)