https://blog.csdn.net/qq_15715657/article/details/81302283
1.下载VS2015
2.下载CMake 3.12.0
3.下载Dlib:
Dlib官网地址:http://www.dlib.net/ml.html
官网下载最新dlib文件
解压放在F盘,并新建一个文件build
用cmake—gui搞了一个下午,一直编译不过,最后改成官网推荐的命令行编译了。
右键shirt打开cmd,操作:
-
cd build
-
cmake -G "Visual Studio 14 2015 Win64" ..
-
巴拉巴拉之后,再输入
cmake --build . --config Release
Release X64位比较快,Debug比较慢,在VS2015配置编译也只是Release X64下
巴拉巴拉之后,这时候在F:\dlib-19.15\build\dlib\Release下有
dlib_lib.lib是我新建备份的
注:选择SSE4或者AVX是官网说在release下,可以加快编译速度,如:http://dlib.net/faq.html#Whyisdlibslow
VS2015新建一个空的win32,C++项目
打开view>>other windows>>项目管理器
编译源码时,需要添加一个源文件source.cpp,使用添加现有项的方式。
目录是F:/dlib-19.15/dlib/all/source.cpp
全部改为自己的目录路径既可以
再添加main文件
-
// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
-
/*
-
-
This is an example illustrating the use of the gui api from the dlib C++ Library.
-
-
-
This is a pretty simple example. It makes a window with a user
-
defined widget (a draggable colored box) and a button. You can drag the
-
box around or click the button which increments a counter.
-
*/
-
-
-
-
#include "stdafx.h"
-
#include <dlib/gui_widgets.h>
-
#include <sstream>
-
#include <string>
-
-
-
using
namespace
std;
-
using
namespace dlib;
-
-
// ----------------------------------------------------------------------------
-
-
class color_box :
public draggable
-
{
-
/*
-
Here I am defining a custom drawable widget that is a colored box that
-
you can drag around on the screen. draggable is a special kind of drawable
-
object that, as the name implies, is draggable by the user via the mouse.
-
To make my color_box draggable all I need to do is inherit from draggable.
-
*/
-
unsigned
char red, green, blue;
-
-
public:
-
color_box(
-
drawable_window& w,
-
rectangle area,
-
unsigned
char red_,
-
unsigned
char green_,
-
unsigned
char blue_
-
) :
-
draggable(w),
-
red(red_),
-
green(green_),
-
blue(blue_)
-
{
-
rect = area;
-
set_draggable_area(rectangle(
10,
10,
400,
400));
-
-
// Whenever you make your own drawable widget (or inherit from any drawable widget
-
// or interface such as draggable) you have to remember to call this function to
-
// enable the events. The idea here is that you can perform whatever setup you
-
// need to do to get your object into a valid state without needing to worry about
-
// event handlers triggering before you are ready.
-
enable_events();
-
}
-
-
~color_box(
-
)
-
{
-
// Disable all further events for this drawable object. We have to do this
-
// because we don't want any events (like draw()) coming to this object while or
-
// after it has been destructed.
-
disable_events();
-
-
// Tell the parent window to redraw its area that previously contained this
-
// drawable object.
-
parent.invalidate_rectangle(rect);
-
}
-
-
private:
-
-
void draw(
-
const canvas& c
-
)
const
-
{
-
// The canvas is an object that represents a part of the parent window
-
// that needs to be redrawn.
-
-
// The first thing I usually do is check if the draw call is for part
-
// of the window that overlaps with my widget. We don't have to do this
-
// but it is usually good to do as a speed hack. Also, the reason
-
// I don't have it set to only give you draw calls when it does indeed
-
// overlap is because you might want to do some drawing outside of your
-
// widget's rectangle. But usually you don't want to do that :)
-
rectangle area = c.intersect(rect);
-
if (area.is_empty() ==
true)
-
return;
-
-
// This simple widget is just going to draw a box on the screen.
-
fill_rect(c, rect, rgb_pixel(red, green, blue));
-
}
-
};
-
-
// ----------------------------------------------------------------------------
-
-
class win :
public drawable_window
-
{
-
/*
-
Here I am going to define our window. In general, you can define as
-
many window types as you like and make as many instances of them as you want.
-
In this example I am only making one though.
-
*/
-
public:
-
win(
-
) :
// All widgets take their parent window as an argument to their constructor.
-
c(*
this),
-
b(*
this),
-
cb(*
this, rectangle(
100,
100,
200,
200),
0,
0,
255),
// the color_box will be blue and 101 pixels wide and tall
-
mbar(*
this)
-
{
-
// tell our button to put itself at the position (10,60).
-
b.set_pos(
10,
60);
-
b.set_name(
"button");
-
-
// let's put the label 5 pixels below the button
-
c.set_pos(b.left(), b.bottom() +
5);
-
-
-
// set which function should get called when the button gets clicked. In this case we want
-
// the on_button_clicked member to be called on *this.
-
b.set_click_handler(*
this, &win::on_button_clicked);
-
// Alternatively, if you have a compiler which supports the lambda functions from the
-
// new C++ standard then you can use a lambda function instead of telling the click
-
// handler to call one of the member functions. So for example, you could do this
-
// instead (uncomment the code if you have C++0x support):
-
/*
-
b.set_click_handler([&](){
-
++counter;
-
ostringstream sout;
-
sout << "Counter: " << counter;
-
c.set_text(sout.str());
-
});
-
*/
-
// In general, all the functions which register events can take either member
-
// functions or lambda functions.
-
-
-
// Let's also make a simple menu bar.
-
// First we say how many menus we want in our menu bar. In this example we only want 1.
-
mbar.set_number_of_menus(
1);
-
// Now we set the name of our menu. The 'M' means that the M in Menu will be underlined
-
// and the user will be able to select it by hitting alt+M
-
mbar.set_menu_name(
0,
"Menu",
'M');
-
-
// Now we add some items to the menu. Note that items in a menu are listed in the
-
// order in which they were added.
-
-
// First let's make a menu item that does the same thing as our button does when it is clicked.
-
// Again, the 'C' means the C in Click is underlined in the menu.
-
mbar.menu(
0).add_menu_item(menu_item_text(
"Click Button!", *
this, &win::on_button_clicked,
'C'));
-
// let's add a separator (i.e. a horizontal separating line) to the menu
-
mbar.menu(
0).add_menu_item(menu_item_separator());
-
// Now let's make a menu item that calls show_about when the user selects it.
-
mbar.menu(
0).add_menu_item(menu_item_text(
"About", *
this, &win::show_about,
'A'));
-
-
-
// set the size of this window
-
set_size(
430,
380);
-
-
counter =
0;
-
-
set_title(
"dlib gui example");
-
show();
-
}
-
-
~win(
-
)
-
{
-
// You should always call close_window() in the destructor of window
-
// objects to ensure that no events will be sent to this window while
-
// it is being destructed.
-
close_window();
-
}
-
-
private:
-
-
void on_button_clicked(
-
)
-
{
-
// when someone clicks our button it will increment the counter and
-
// display it in our label c.
-
++counter;
-
ostringstream sout;
-
sout <<
"counter: " << counter;
-
c.set_text(sout.str());
-
}
-
-
void show_about(
-
)
-
{
-
message_box(
"About",
"This is a dlib gui example program");
-
}
-
-
unsigned
long counter;
-
label c;
-
button b;
-
color_box cb;
-
menu_bar mbar;
-
};
-
-
// ----------------------------------------------------------------------------
-
-
int main()
-
{
-
// create our window
-
win my_window;
-
-
-
// wait until the user closes this window before we let the program
-
// terminate.
-
my_window.wait_until_closed();
-
-
return
0;
-
}
-
-
// ----------------------------------------------------------------------------
-
-
// Normally, if you built this application on MS Windows in Visual Studio you
-
// would see a black console window pop up when you ran it. The following
-
// #pragma directives tell Visual Studio to not include a console window along
-
// with your application. However, if you prefer to have the console pop up as
-
// well then simply remove these #pragma statements.
-
#ifdef _MSC_VER
-
# pragma comment( linker, "/entry:mainCRTStartup" )
-
# pragma comment( linker, "/SUBSYSTEM:WINDOWS" )
-
#endif
-
-
// ----------------------------------------------------------------------------
点击编译即可
按照上面就不会出现
USER_ERROR__inconsistent_build_configuration__see_dlib_faq_2和
USER_ERROR__inconsistent_build_configuration__see_dlib_faq_1
的问题,但是
(1)如果遇到png.h文件找不到,确定附加库目录已经包含dlib,使用"dlib/external/libpng/png.h"
去代替<png.h>
即可。
(2)最好使用Release版本去编译使用,速度快。
(3)如在Debug模式下OBJ字节数组太大,则在属性 -> C/C++ -> 命令行 加入/bigobj
即可。
(4)若读取jpeg图片错误或找不到jpeglib.h
,在第五步中,加入DLIB_JPEG_STATIC
即可。
(5)如果是使用VS2015,主要要更新到update 3,这才支持C++11的