Как я компилирую face_landmark_detection_ex, который требует dlib?

Мне дают этот код для названной программы face_landmark_detection_ex. Нет никакого make-файла.

Как я могу узнать то, что управляет, чтобы я ввел, в Ubuntu, для создания исполняемого файла, который я могу выполнить?

Я пытался скомпилировать его с:

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

Но это возвратилось:

   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

И тонна загрузки ошибок как:

   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 \
     ^

... и т.д.

Я уже сделал: sudo apt install libdlib-dev

Обновление

Позже, я пытался работать:

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

Но это, казалось, не работало. Это произвело эти "неопределенные ссылочные" ошибки, включая для символов в dlib пространство имен. Полные ошибки находятся в pastebin; вот первые несколько строк:

$ 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
задан 28 July 2017 в 00:10

1 ответ

Можно опускать некоторых требуемых -l флаги, или можно связываться против неверной версии dlib.

Кроме того, -ldlib, Вам также нужно -llapack, -lblas, и -lgif.

Это работает на меня на Ubuntu 16.04 LTS:

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

Вывод, показанный в Вашем вопросе, указывает на это, когда Вы попытались создать программу, заголовочные файлы в /usr/local/include/dlib были найдены. Это не то, где libdlib-dev пакет помещает свои заголовочные файлы, таким образом, версия dlib, который Вы установили сами, 19.4, является той, которая используется.

  • Это, вероятно, хорошо. Мало того, что это является более новым, но и я верю face_landmark_detection_ex является несовместимым с dlib Ubuntu, потому что он компилируется с DLIB_NO_GUI_SUPPORT.
  • Если Вы иначе не используете версию dlib, обеспеченного libdlib-dev и его зависимости, я рекомендую удалить их (см. ниже).

Dlib иногда используется без того, чтобы быть установленным, но кажется, что Вы установили его в /usr/local, возможно, с методом как один данный на шаге 3.1 здесь. Принятие Вас работало sudo ldconfig после установки его, и что liblapack-dev, libblas-dev, и libgif-dev пакеты установлены, передав -llapack -lblas -ldlib -lgif к компилятору должен произвести успешную сборку:

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

Можно хотеть передать другие флаги компилятору для включения предупреждений и (как комментарии исходного кода упоминают), оптимизация.

Я пытался опустить различные комбинации флагов для получения различных ошибок, но я не мог произвести определенные ошибки компоновщика, которые Вы получили, поэтому возможно, больше продолжается здесь.

Удаление обеспеченного системой Dlib

Гарантировать что более старая версия dlib (от того, когда Вы установили libdlib-dev) не вмешивается, а также предотвратить беспорядок, я предлагаю удалить его. Одной проблемой, которую это может помочь решить, является возможность, что компилятор использует заголовки для dlib версии, которую Вы установили, но компоновщик использует обеспеченную системой версию библиотеки. Они не совместимы друг с другом.

Принятие Вас установило обеспеченный системой dlib путем выполнения sudo apt install libdlib-dev и никакое другое программное обеспечение Ubuntu не в зависимости от него, эти команды удалят его:

sudo apt remove libdlib-dev
sudo apt autoremove

-dev пакет обеспечивает просто заголовочные файлы, но он заставляет саму библиотеку быть установленной как зависимость; autoremove действие удаляет пакеты, которые установлены только для удовлетворения зависимостей других пакетов, которые были с тех пор удалены.

Если после этого зависимости все не установлены, можно добавить их назад. Например, Вам, возможно, придется выполнить это:

sudo apt install liblapack-dev libblas-dev libgif-dev

(Если Вам нравится, Вы могли бы сделать это сначала, прежде, чем удалить пакеты, отметить их, как вручную установлено и препятствовать тому, чтобы они были удалены во-первых.)

Затем я предлагаю удалить и переустановить версию dlib, который Вы установили вручную, хотя просто работая sudo ldconfig снова могло бы быть достаточным, если версия, которую Вы, никоим образом установили не повреждается. Это даже не могло бы быть необходимо, но это не должно наносить ущерб.

Одно преимущество восстановления и переустановки dlib - то, что Вам, вероятно, сообщат, не удовлетворяются ли некоторые ее зависимости больше.

При установке Dlib снова он мог бы дать Вам опцию использования ее собственной встроенной версии библиотеки, что он зависит от или установка обеспеченной системой библиотеки. Например, если liblapack-dev и libblas-dev не установлены, это может предложить, чтобы Вы установили их. Если это делает, я рекомендую делать это - для одного, можно получить лучшую производительность - и запустить сборку Dlib снова.

Если Вы делаете это, и Вы получаете те же ошибки - или различные - затем обновите свой вопрос с большей информацией.

1
ответ дан 7 December 2019 в 15:32

Другие вопросы по тегам:

Похожие вопросы: