开源项目推荐:Dlib C++ Libraries使用说明与内存泄漏问题解决(★firecat推荐★)

992 阅读8分钟

Dlib是一个现代化的C ++工具箱,其中包含用于在C ++中创建复杂软件以解决实际问题的机器学习算法和工具。它广泛应用于工业界和学术界,包括机器人,嵌入式设备,移动电话和大型高性能计算环境。Dlib的开源许可证 允许您在任何应用程序中免费使用它。Dlib有很长的时间,包含很多模块,近几年作者主要关注在机器学习、深度学习、图像处理等模块的开发。

一、官网

dlib.net/

dlib.net/files/ 源码下载

dlib.net/compile.htm… 编译说明

github.com/davisking/d…

 

二、教程

blog.csdn.net/Dawnfox/art… win10之dlib安装过程(c++调用库,非python版)

blog.csdn.net/yiyuehuan/a… Dlib相关问题

jingyan.baidu.com/article/48b… Dlib机器学习库的安装和使用

 

三、我个人的VS2015环境配置(Dlib v19.1版本之后必须要VS2015才能编译)

1、使用CMake转换生成VS2015工程。使用默认配置即可,不修改任何参数。

2、VS2015打开Dlib 程。点击dlib属性页。需要注意的地方有两处。

(1)配置属性》c/c++》常规中的附加包含目录,需要添加dlib解压文件dlib目录中external中的libjpeg,libpng,zlib三个文件目录

D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libjpeg

D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\libpng

D:\My Resources\7-cmakeprj\dlib-19.17\dlib\external\zlib

(2)配置属性》c/c++》预处理器中的预处理器定义。需要注意是否存在

DLIB_JPEG_SUPPORT
DLIB_PNG_SUPPORT
DLIB_JPEG_STATIC

(3)Debug和Release分别编译,生成dlibd.lib和dlib.lib

3、VS2015新建新建Win32控制台应用工程,测试dlib库是否可以用。

(1)把Dlib源码包拷贝到Win32 exe工程。

(2)Win32 exe工程,配置属性》c/c++》常规中的附加包含目录

..\dlib-19.17
..\dlib-19.17\dlib\external\libjpeg
..\dlib-19.17\dlib\external\libpng
..\dlib-19.17\dlib\external\zlib

注意,千万不要包含..\dlib-19.17\dlib,否则会报错:

***\dlib\dlib-19.4\dlib\dlib_include_path_tutorial.txt(1): fatal error C1189: #error: “Don’t put the dlib folder in your include path”

(3)Win32 exe工程,配置属性》c/c++》预处理器中的预处理器定义,添加:

DLIB_JPEG_SUPPORT
DLIB_PNG_SUPPORT
DLIB_JPEG_STATIC

(4)Win32 exe工程,配置属性》链接器》常规中的附加库目录。添加dlib.lib所在文件目录

..\Dlib-19.17\Win32

(5)Win32 exe工程,配置属性》链接器》输入的附加依赖项。添加dlibd.lib和dlib.lib。

(6)如果在链接(编译一般不会有问题)的时候出现下面的问题

error LNK2001: 无法解析的外部符号 USER_ERROR__missing_dlib_all_source_cpp_file__OR__inconsistent_use_of_DEBUG_or_ENABLE_ASSERTS_preprocessor_directives

那么就需要将 dlib/all/source.cpp 该文件添加到Win32 exe项目中,注意要以添加现有项的方式直接选取该文件。

若没有出现上面的问题,则一般不需要添加该文件。

添加soure.cpp,编译会报错:

在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”

解决办法是:鼠标右键soure.cpp,属性,不使用预编译头

4、如何使用SQLite,官网下载www.sqlite.org/download.ht…,sqlite-amalgamation-3280000.zip

解压,自己新建工程编译成静态库,请参考:blog.csdn.net/starelegant…

然后把sqlite3.h拷贝到路径\Dlib-19.17\dlib\sqlite即可。

修改\Dlib-19.17\dlib\sqlite.h头文件

#include <sqlite3.h>//原来

#include "sqlite3.h" //firecat修改后

5、把\dlib-19.17\tools\visual_studio_natvis\dlib.natvis拷贝到

C:\Users\<用户名>\Documents\Visual Studio 2015\Visualizers

 

四、MFC建立项目,发现内存泄漏

使用windbg可以检测到:

1b55c8d SmartDispenser!operator new+0x0000000d
1826e7e SmartDispenser!dlib::threads_kernel_shared::thread_pool+0x0000008e
1539eb0 SmartDispenser!dlib::unregister_thread_end_handler<dlib::logger::global_data>+0x00000040
15c6e5a SmartDispenser!dlib::logger::global_data::~global_data+0x0000005a
16557cb SmartDispenser!dlib::logger::global_data::`scalar deleting destructor'+0x0000002b
15c8b51 SmartDispenser!dlib::logger::~logger+0x000000e1
1bf6968 SmartDispenser!dlib::logger_helper_stuff::`dynamic atexit destructor for 'log''+0x00000028

我提交的问题:github.com/davisking/d…

解决方法:github.com/davisking/d…

说白了就是Dlib-19.17\dlib\threads\threads_kernel_shared.cpp,把变量值修改一下:

//do_not_ever_destruct = true;
do_not_ever_destruct = false; //firecat,Detected memory leaks

 

五、Dlib主要功能

主要特点

 

---

C++库大全

github.com/fffaraz/awe…