Мне дают этот код для названной программы 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_'
Можно опускать некоторых требуемых -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
.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 (от того, когда Вы установили 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 снова.
Если Вы делаете это, и Вы получаете те же ошибки - или различные - затем обновите свой вопрос с большей информацией.