web-dev-qa-db-fra.com

Comment compiler face_landmark_detection_ex, qui nécessite dlib?

On me donne ce code pour un programme appelé face_landmark_detection_ex. Il n'y a pas de fichier makefile.

Comment puis-je savoir quelle commande je dois taper dans Ubuntu pour produire un exécutable que je peux exécuter?

J'ai essayé de le compiler avec:

 g++ face_landmark_detection_ex.cpp  -o face $(pkg-config --cflags --libs dlib)

Mais cela est revenu:

   Package dlib was not found in the pkg-config search path.
   Perhaps you should add the directory containing `dlib.pc'
   to the PKG_CONFIG_PATH environment variable

Et une tonne d'erreurs comme:

   No package 'dlib' found
   In file included from /usr/local/include/dlib/geometry/rectangle.h:7:0,
                    from /usr/local/include/dlib/geometry.h:6,
                    from /usr/local/include/dlib/image_processing/object_detector.h:7,
                    from /usr/local/include/dlib/image_processing/frontal_face_detector.h:7,
                    from face_landmark_detection_ex.cpp:41:
   /usr/local/include/dlib/algs.h:17:10: error: #error "Dlib requires C++11 support.  Give your compiler the               -std=c++11 option to enable it."
            #error "Dlib requires C++11 support.  Give your compiler the -std=c++11
             ^
   In file included from /usr/include/c++/5/array:35:0,
                    from /usr/local/include/dlib/serialize.h:150,
                    from /usr/local/include/dlib/geometry/rectangle.h:10,
                    from /usr/local/include/dlib/geometry.h:6,
                    from /usr/local/include/dlib/image_processing/object_detector.h:7,
                    from /usr/local/include/dlib/image_processing/frontal_face_detector.h:7,
                    from face_landmark_detection_ex.cpp:41:
   /usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support        for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler               options.
    #error This file requires compiler and library support \
     ^

...et ainsi de suite.

J'ai déjà fait: Sudo apt install libdlib-dev

Mise à jour

Plus tard, j'ai essayé de courir:

g++ face_landmark_detection_ex.cpp -l dlib -std=c++11 -o main

Mais cela n'a pas semblé fonctionner. Il a généré ces "référence non définie" , y compris pour les symboles de l'espace de noms dlib. Les erreurs complètes sont dans Pastebin; voici les premières lignes:

$ g++ face_landmark_detection_ex.cpp -l dlib -std=c++11 -o main
/tmp/ccY36F7N.o: In function `main':
face_landmark_detection_ex.cpp:(.text+0x15e): undefined reference to `dlib::image_window::image_window()'
face_landmark_detection_ex.cpp:(.text+0x16d): undefined reference to `dlib::image_window::image_window()'
face_landmark_detection_ex.cpp:(.text+0x431): undefined reference to `dlib::image_window::clear_overlay()'
face_landmark_detection_ex.cpp:(.text+0x4a1): undefined reference to `dlib::image_window::add_overlay(std::vector<dlib::image_display::overlay_line, std::allocator<dlib::image_display::overlay_line> > const&)'
face_landmark_detection_ex.cpp:(.text+0x5e3): undefined reference to `dlib::image_window::~image_window()'
face_landmark_detection_ex.cpp:(.text+0x5f2): undefined reference to `dlib::image_window::~image_window()'
face_landmark_detection_ex.cpp:(.text+0x773): undefined reference to `dlib::image_window::~image_window()'
face_landmark_detection_ex.cpp:(.text+0x78a): undefined reference to `dlib::image_window::~image_window()'
/tmp/ccY36F7N.o: In function `dlib::lapack::binding::gesdd(char, int, int, double*, int, double*, double*, int, double*, int, double*, int, int*)':
face_landmark_detection_ex.cpp:(.text._ZN4dlib6lapack7binding5gesddEciiPdiS2_S2_iS2_iS2_iPi[_ZN4dlib6lapack7binding5gesddEciiPdiS2_S2_iS2_iS2_iPi]+0x91): undefined reference to `dgesdd_'
1
gihidoma

Vous omettez peut-être certains indicateurs obligatoires -l, ou vous créez un lien avec la mauvaise version de dlib.

Outre -ldlib, vous avez également besoin de -llapack, -lblas et -lgif.

Cela fonctionne pour moi sur Ubuntu 16.04 LTS:

g++ -std=c++11 -o face_landmark_detection_ex face_landmark_detection_ex.cpp -llapack -lblas -ldlib -lgif

Le résultat affiché dans votre question indique que, lorsque vous avez tenté de créer le programme, des fichiers d'en-tête dans /usr/local/include/dlib ont été trouvés. Ce n'est pas là que le paquetage libdlib-dev place ses fichiers d'en-tête. La version de dlib que vous avez installée vous-même, 19.4, est celle qui est utilisée.

  • C'est probablement bien. Non seulement il est plus récent, mais je pense que face_landmark_detection_ex est incompatible avec dlib d’Ubuntu car il est compilé avec DLIB_NO_GUI_SUPPORT.
  • Si vous n'utilisez pas autrement la version de dlib fournie par libdlib-dev et ses dépendances, je vous recommande de les désinstaller (voir ci-dessous).

Dlib est parfois utilisé sans être installé, mais il semble que vous l’ayez installé dans /usr/local, peut-être avec une méthode comme celle donnée à l’étape 3.1 ici . En supposant que vous ayez exécuté Sudo ldconfig après l’avoir installé et que les packages liblapack-dev, libblas-dev et libgif-dev sont installés, le fait que -llapack -lblas -ldlib -lgif soit envoyé au compilateur devrait aboutir à un résultat positif. construire:

ek@Io:~/src$ g++ -std=c++11 -o face_landmark_detection_ex face_landmark_detection_ex.cpp -llapack -lblas -ldlib -lgif
ek@Io:~/src$ ./face_landmark_detection_ex
Call this program like this:
./face_landmark_detection_ex shape_predictor_68_face_landmarks.dat faces/*.jpg

You can get the shape_predictor_68_face_landmarks.dat file from:
http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2

Vous voudrez peut-être transmettre d'autres indicateurs au compilateur pour activer les avertissements et (comme le mentionnent les commentaires du code source) les optimisations.

J'ai essayé d'omettre diverses combinaisons d'indicateurs pour obtenir différentes erreurs, mais je n'ai pas été en mesure de produire le erreurs spécifiques de l'éditeur de liens ce que vous avez, donc peut-être que d'autres se produisent ici.

Désinstallation de Dlib fournie par le système

Pour vous assurer que l'ancienne version de dlib (depuis l'installation de libdlib-dev]) n'interfère pas, ainsi que pour éviter toute confusion, je suggère de la désinstaller. Un problème que cela peut aider à résoudre est la possibilité que le compilateur utilise des en-têtes pour la version de dlib que vous avez installée mais que l'éditeur de liens utilise la version de la bibliothèque fournie par le système . Ils ne sont pas compatibles les uns avec les autres.

En supposant que vous ayez installé la bibliothèque dlib fournie par le système en exécutant Sudo apt install libdlib-dev et qu'aucun autre logiciel Ubuntu n'en dépende, ces commandes le désinstalleront:

Sudo apt remove libdlib-dev
Sudo apt autoremove

Le paquetage -dev fournit uniquement les fichiers d’en-tête, mais la bibliothèque elle-même est installée comme dépendance. L'action autoremove supprime les packages installés uniquement pour satisfaire les dépendances des autres packages supprimés.

Si, après cela, les dépendances ne sont pas toutes installées, vous pouvez les rajouter. Par exemple, vous devrez peut-être exécuter ceci:

Sudo apt install liblapack-dev libblas-dev libgif-dev

(Si vous le souhaitez, vous pouvez le faire en premier, avant de supprimer des paquetages, pour les marquer comme installés manuellement et empêcher leur suppression en premier lieu.)

Ensuite, je suggère de désinstaller et de réinstaller la version de dlib que vous avez installée manuellement, bien que simplement exécuter à nouveau Sudo ldconfig puisse être suffisant, si la version que vous avez installée n’est en aucun cas endommagée. Ce n'est peut-être même pas nécessaire, mais cela ne devrait pas causer de préjudice.

Un des avantages de la reconstruction et de la réinstallation de dlib est que vous serez probablement informé si certaines de ses dépendances ne sont plus satisfaites.

Lorsque vous réinstallez Dlib, il peut vous donner la possibilité d’utiliser sa propre version intégrée d’une bibliothèque dont elle dépend ou d’installer la bibliothèque fournie par le système. Par exemple, si liblapack-dev et libblas-dev ne sont pas installés, il est peut-être préférable de les installer. Si tel est le cas, je vous recommande de procéder de la sorte (vous pouvez obtenir de meilleures performances, par exemple) et recommencer la construction de Dlib.

Si vous faites cela et que vous obtenez les mêmes erreurs - ou différentes - alors veuillez mettre à jour votre question avec davantage d'informations.

1
Eliah Kagan