如何编译需要 dlib 的 face_landmark_detection_ex?

如何编译需要 dlib 的 face_landmark_detection_ex?

我被赋予此代码对于名为 的程序face_landmark_detection_ex。没有 makefile。

在 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

您可能遗漏了一些必需的-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与 Ubuntu 的 dlib 不兼容,因为它是用 编译的DLIB_NO_GUI_SUPPORT
  • 如果您没有使用所提供的 dlib 版本libdlib-dev及其依赖项,我建议卸载它们(见下文)。

Dlib 有时会在未安装的情况下使用,但似乎您已在 中安装了它/usr/local,也许是使用类似方法此处步骤 3.1 中给出的假设您sudo ldconfig在安装后运行它,并且安装了liblapack-devlibblas-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-devlibblas-dev未安装,它可能会建议您安装它们。如果确实如此,我建议这样做(首先,您可能会获得更好的性能),然后重新开始 Dlib 构建。

如果您这样做并且遇到相同或不同的错误,请使用更多信息更新您的问题。

相关内容