visual studio和cmake如何编译dlib库
官网 dlib C++ Library 对应的是最新版本,只能用到vs2015版本及以后
如果使用vs2013,所以需要下载vs2013可用的版本。
就是说dlib版本与vs版本有对应关系
所有版本
dlib C++ Library - Browse /dlib at SourceForge.net
Releases · davisking/dlib · GitHub
下面以dlib19.0与vs2013为例,其他都一样。
使用19.0版本,可以在vs2013使用
Release v19.0 · davisking/dlib · GitHub
下载
下载后源码位置
D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\CV\dlib_source\dlib-19.0
使用cmake将dlib转成vs2013项目
下载cmake-3.6.1
D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\CV\cmake-3.6.1-win64-x64\cmake-3.6.1-win64-x64
运行 cmake-gui.exe
显示source code,就是dlib源码位置
D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\CV\dlib_source\dlib-19.0\dlib
build the binaries
转换后的目录
在下面目录中建立一个build目录
D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\CV\dlib_source\dlib-19.0
设置到
D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\CV\dlib_source\dlib-19.0\build
点击configure,选择 Visual Studio 12 2013 Win64,然后选择Genarate
选择后,点击finish,会进行导入第一生成,可能会有红色警告,告知无法找到cuda,可以不用管,再次点击generate生成,
此时在刚才建立的build目录中,会生成vs2013的dlib项目
运行dlib.sln
不管是opencv还是dlib,如果你的程序是debug版本,需要使用dlib或opencv的debug版本,如果你的程序是release版本,需要使用dlib或opencv的release版本。
下面先编译 dlib对应x64的debug版本,注意目前的所有程序都是基于x64,win32的已经逐步淘汰。
打开dlib.sln后,可以看到缺省设置的就是x64下的debug
右键选择ALL_BULID,然后rebuild
显示全部build成功
在build目录的debug目录中会生成基于x64的debug的dlib库
Release版本的build一样
把debug设置修改为release即可
记住:如果你自己的vs2013下的程序设置的是debug模式,使用的dlib也是debug。同样道理,你的程序是release,dlib也需要release。
下面需要设置在自己的程序中使用dlib,以debug模式为例。
下面以检测人脸特征点为例
Vs2013中建立一个控制台的空项目, face_landmarks,检测人脸的68个特征点
如果solution解决方案有多个project项目,设置为startup project,因为运行的时候只能运行一个project,就是运行这个设置为startup的project
右键 sorce files中增加new item
增加一个主c++文件
确认设置好的是x64的debug环境,一定要点击下面的configuration manager看下
下面显示还是win32,需要修改为x64,并且Build打勾要
点击new,选择x64即可点击ok
配置dlib的包含(include)文件和库(lib)文件的目录位置
包含文件路径
D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\CV\dlib_source\dlib-19.0
库文件路径,就是上述build好的库文件位置
D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\CV\dlib_source\dlib-19.0\build\Debug
配置链接库名 dlib.lib
C/C++->预处理器添加
DLIB_PNG_SUPPORT
DLIB_JPEG_SUPPORT
很多时候dlib需要和opencv配合使用,对于opencv的配置,看我这个系列的前面课程,有详细介绍。
Dlib19.20编译vs2015时候出现问题
- d:\lyp\project\ai_train\c_plus_opencv\learn_cv\dlib_vs2015\dlib\dlib\global_optimization/find_max_global.h(79): error C2535: “unknown-type dlib::gopt_impl::call_function_and_expand_args<max_unpack>::go(T &&,const dlib::matrix<double,0,1,dlib::default_memory_manager,dlib::row_major_layout> &)”: 已经定义或声明成员函数 (编译源文件 D:\lyp\Project\AI_Train\c_plus_opencv\learn_cv\dlib_vs2015\dlib\dlib\svm\auto.cpp)
解决方案:
这个问题是由vs2015导致的。
Dlib源码中找到删除auto.cpp以及kalman_filter.cpp源码文件
在项目文件中也删除
重新编译后成功,实际使用中会出现问题
无法解析的外部符号 USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2,
该符号在函数 "void __cdecl `dynamic initializer for 'dlib_check_not_configured_helper_variable''(void)"
(??__Edlib_check_not_configured_helper_variable@@YAXXZ) 中被引用
- D:\lyp\code\id_photo\id_cmake\DMS\out_vc14_release\bin\pohotoSysSDK.dll : fatal error LNK
打开cmake之后的项目,找到这个路径(就是dlib的头文件目录)
找到test_for_odr_violations.h,也就是下面这个
点开找到这一段
注意
const extern int USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2=0
这一行,官方的是没有“=0”的。加上,再编译就O了。
测试可以解决