Как скомпилировать 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. Полные ошибки в пастебине; вот первые несколько строк:

$ 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 > 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

2 ответа

Возможно, вы опускаете некоторые обязательные флаги -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

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

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

Удаление системного 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
ответ дан 18 July 2018 в 09:33

Возможно, вы опускаете некоторые обязательные флаги -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

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

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

Удаление системного 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
ответ дан 24 July 2018 в 19:22

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

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