web-dev-qa-db-fra.com

Makefile pour compiler le code OpenCV en C++ sur Ubuntu/Linux

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

18
SPV

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 .

24
sietschie

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

5
Serrano

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

0
Paul R