不能在 dlib cpp 文件中包含 JPEG_SUPPORT 标头

Posted

技术标签:

【中文标题】不能在 dlib cpp 文件中包含 JPEG_SUPPORT 标头【英文标题】:Can't include the JPEG_SUPPORT headers in a dlib cpp file 【发布时间】:2017-08-18 11:34:30 【问题描述】:

我试图编译一个 cpp 文件:dlib 中的 face-finder:http://dlib.net/face_detection_ex.cpp.html。但是当我运行它时,它说我必须包含 jpg 和 png 文件的库:

processing image /home/james/Work/Coding/Sources/Image/950.jpg

exception thrown!
Unable to load image in file /home/dave/Code/Resources/Images/500.jpg.
You must #define DLIB_JPEG_SUPPORT and link to libjpeg to read JPEG files.
Do this by following the instructions at http://dlib.net/compile.html.

Note that you must cause DLIB_JPEG_SUPPORT to be defined for your entire project.
So don't #define it in one file. Instead, use a compiler switch like -DDLIB_JPEG_SUPPORT
so it takes effect for your entire application.

我尝试使用-DDLIB_JPEG_SUPPORT 标志,但失败了,所以我很想在文件中定义它们:

*/

#define DLIB_JPEG_SUPPORT
#define DLIB_PNG_SUPPORT

#include </home/james/dlib/image_io.h>
#include </home/james/dlib/image_processing/frontal_face_detector.h>
#include </home/james/dlib/gui_widgets.h>
#include </home/james/dlib/image_io.h>
#include <iostream>

using namespace dlib;
using namespace std;

// ----------------------------------------------------------------------------------------

int main(int argc, char** argv)

但编译失败:

james@james-Toshiba-Satellite-8505:~/Work/Coding/Cpp/Dlib/Examples$ g++ -std=c++11 -O3 -I.. ~/dlib/all/source.cpp -lpthread -lX11 face_detection_ex.cpp -o face_detection_ex_2/tmp/ccVHitZj.o: In function `main':
face_detection_ex.cpp:(.text.startup+0x1c0d): undefined reference to `dlib::jpeg_loader::jpeg_loader(std::string const&)'
face_detection_ex.cpp:(.text.startup+0x1d0a): undefined reference to `dlib::jpeg_loader::is_gray() const'
face_detection_ex.cpp:(.text.startup+0x1e3b): undefined reference to `dlib::png_loader::png_loader(std::string const&)'
face_detection_ex.cpp:(.text.startup+0x1f04): undefined reference to `dlib::png_loader::is_gray() const'
face_detection_ex.cpp:(.text.startup+0x1f23): undefined reference to `dlib::png_loader::is_gray() const'
face_detection_ex.cpp:(.text.startup+0x1f38): undefined reference to `dlib::png_loader::is_graya() const'
face_detection_ex.cpp:(.text.startup+0x1f59): undefined reference to `dlib::png_loader::is_graya() const'
face_detection_ex.cpp:(.text.startup+0x1f6e): undefined reference to `dlib::png_loader::is_rgb() const'
face_detection_ex.cpp:(.text.startup+0x1f83): undefined reference to `dlib::png_loader::is_rgb() const'
face_detection_ex.cpp:(.text.startup+0x1f98): undefined reference to `dlib::png_loader::is_rgba() const'
face_detection_ex.cpp:(.text.startup+0x1fad): undefined reference to `dlib::png_loader::is_rgba() const'
face_detection_ex.cpp:(.text.startup+0x2009): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
face_detection_ex.cpp:(.text.startup+0x20b6): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
face_detection_ex.cpp:(.text.startup+0x211c): undefined reference to `dlib::png_loader::~png_loader()'
face_detection_ex.cpp:(.text.startup+0x229a): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
face_detection_ex.cpp:(.text.startup+0x2587): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
face_detection_ex.cpp:(.text.startup+0x2ea7): undefined reference to `dlib::png_loader::~png_loader()'
face_detection_ex.cpp:(.text.startup+0x2fe9): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
face_detection_ex.cpp:(.text.startup+0x30ac): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
face_detection_ex.cpp:(.text.startup+0x313c): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
face_detection_ex.cpp:(.text.startup+0x31c4): undefined reference to `dlib::png_loader::get_row(unsigned int) const'
collect2: error: ld returned 1 exit status

【问题讨论】:

【参考方案1】:

请在提问之前阅读编译器和工具向您显示的错误和建议消息。

关于:抛出异常!无法在文件中加载图像 /home/dave/Code/Resources/Images/500.jpg。你必须#define DLIB_JPEG_SUPPORT 并链接到 libjpeg 以读取 JPEG 文件。这样做 按照http://dlib.net/compile.html 的说明进行操作。

安装libjpeg、libpng等库并在编译时使用它们来链接程序。请阅读建议页面http://dlib.net/compile.html。

如果您有多个源代码文件,请在编译之前从您的代码中删除预处理器指令。

#define DLIB_JPEG_SUPPORT
#define DLIB_PNG_SUPPORT

并使用建议的切换编译器:-DDLIB_JPEG_SUPPORT。

请注意,您必须为您的设备定义 DLIB_JPEG_SUPPORT 整个项目。所以不要在一个文件中#define 它。相反,使用 像 -DDLIB_JPEG_SUPPORT 这样的编译器开关,因此它对您的 整个应用程序。

所以,使用这样的命令来编译:

g++ face_detection_ex.cpp -o face_detection_ex_2 -std=c++11 -O3 -I.. ~/dlib/all/source.cpp -lpthread -lX11 -ljpeg -lpng -DDLIB_JPEG_SUPPORT -DDLIB_PNG_SUPPORT

假设库(libjpeg 和 libpng)已经安装。

【讨论】:

尝试定义它们,但它们不起作用。我已经安装了 libjpeg 和 libpng。 当我尝试运行你的命令时,它说:g++: error: lpng: No such file or directory 我忘记了命令中的破折号,但它现在已更新。更改( lpng -> -lpng )。

以上是关于不能在 dlib cpp 文件中包含 JPEG_SUPPORT 标头的主要内容,如果未能解决你的问题,请参考以下文章

在cmake的所有cpp文件中包含c ++标头[重复]

不能在 Linux 的 Matlab 中包含 OpenCV 函数

如何在某些头文件(嵌套类)的 cpp 文件中包含我的实现

在android NDK中包含本地头文件时的未定义引用

3 个 .h 和 3 个 .cpp 文件

在工程中包含两个cpp文件(只有一个有main),那这段程序是怎样运行的?