2017-05-05 33 views
2

我正在使用DlibOpenCVC++Without CMakeVisual Studio 2015我试过face_landmark_detection_ex示例来检测脸部通过使用笔记本电脑摄像头,它工作正常。但我不知道为什么Dlib是说:164 of 8616 functions (1.9%) were compiled, the rest were copied from previous compilation.为什么Dlib会编译8000多个函数?

我认为例子非常简单,并且不需要8000+功能工作,我也想知道为什么它需要57页的文件夹,并从库73 Header Files

依赖关系层次结构根本不清楚Dlib官方网站上的文档。

注:我已经加入source.cpp文件到我的项目,因为我是越来越Linker Error,这可以参考:

在大多数情况下,使用这个库所有你需要做的是什么地方提取它 ,请确保包含dlib文件夹的文件夹位于您的 包含路径中,并最终将dlib/all/source.cpp添加到您的项目中。它 值得注意的是,大多数dlib是“仅标题”,这意味着,在许多情况下,您实际上不必将dlib/all/source.cpp 编译到您的应用程序中。因此,如果您在从项目中排除dlib/all/source.cpp时没有收到链接器错误,那么您不需要它。

修改Source.cpp: - 通过CMake的

#include "../base64/base64_kernel_1.cpp" 
#include "../entropy_decoder/entropy_decoder_kernel_2.cpp" 
#include "../tokenizer/tokenizer_kernel_1.cpp" 
#include "../unicode/unicode.cpp" 
#include "../dir_nav/dir_nav_kernel_1.cpp" 
#include "../logger/logger_kernel_1.cpp" 
#include "../misc_api/misc_api_kernel_1.cpp" 
#include "../threads/threaded_object_extension.cpp" 
#include "../threads/threads_kernel_1.cpp" 
#include "../threads/threads_kernel_shared.cpp" 
#include "../timer/timer.cpp" 

#include "../gui_widgets/fonts.cpp" 
#include "../gui_widgets/widgets.cpp" 
#include "../gui_widgets/drawable.cpp" 
#include "../gui_widgets/canvas_drawing.cpp" 
#include "../gui_widgets/style.cpp" 
#include "../gui_widgets/base_widgets.cpp" 
#include "../gui_core/gui_core_kernel_1.cpp" 

enter image description here

+0

不建议包括CPP文件,这可能是导致问题的原因。当你包含一个文件时,该文件将被有效地粘贴到你的文件中。如果包含cpp文件,那么该cpp文件中的所有定义现在都是文件的一部分。如果那是8000+的功能,那么你什么时候需要它。按照惯例,cpp文件被编译一次,然后根据需要链接。包括h和hpp文件。 – user4581301

+0

以及如何重置编译,以便现在需要的文件可以删除而不会导致错误?因为现在的问题是当我尝试删除'#include'行时,它会导致错误。 –

+0

dlib可能有一个可以链接的.lib文件。如果没有,你应该制作.lib文件([应该是dlib站点的说明](http://dlib.net/compile.html))。 – user4581301

回答

3

最好的方式来使用DLIB。 There is small tutorial how to include dlib in your project with CMake

CMake的另一种方式 - 您可以编译Dlib库并在项目中使用结果二进制文件(.lib)。要生成的.lib文件,您可以使用从Visual Studio开发人员命令提示符(从DLIB文件夹)这个命令:编译完成

md build 
cd build 
cmake .. -G"Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=c:/where/to/put/release/library 
cmake --build . --target install --config Release 

后,必须在目标目录中的.lib和头。如果你想调试你的程序 - 你应该编译和重新安装DLIB到不同的目录

cmake .. -G"Visual Studio 14 2015 Win64" -DCMAKE_INSTALL_PREFIX=c:/where/to/put/debug/library 
cmake --build . --target install --config Debug 

这会让你调试的二进制文件。接下来在基于CMake的应用项目,你可以这样写行:

cmake_minimum_required(VERSION 3.2) 
find_package(dlib REQUIRED) 
add_executable(example example.cpp) 
target_link_libraries(example dlib::dlib) 

你还可以用

md build 
cd build 
cmake .. -G"Visual Studio 14 2015 Win64" -DCMAKE_PREFIX_PATH=c:/where/to/put/release/library 
cmake --build . --target install --config Release 

和调试版本编译这个应用程序:

md build 
cd build 
cmake .. -G"Visual Studio 14 2015 Win64" -DCMAKE_PREFIX_PATH=c:/where/to/put/debug/library 
cmake --build . --target install --config Debug 

这里请注意当编译你正在使用的Dlib时CMAKE_ INSTALL _PREFIX - 这是在哪里把库第二编译项目时,您使用CMAKE_ PREFIX _PATH - 在搜索DLIB

正如你可以在这里看到 - 有很多的步骤,你可以在每一个阶段出现错误,这样你就可以只需在您的项目中删除“all/source.cpp”(就像您已经完成的那样) - 而这一切,都可以工作。使用全部/源代码方式,您不需要在不同的编译模式(调试/发布),体系结构(x86/x64),运行时链接(共享/静态/多线程...),不同的编译器中进行思考 - 所有这些选项都需要单独dlib安装

如果你会尝试使用CMake,并且如果你会得到一些错误 - 只要阅读CMake的输出,就会有很多细节。这种方式需要一些使用CMake的经验,你可以获得文档here

所以回答你的主要问题 - 为什么编译8000函数 - 这是不考虑不同编译模式的代价。是的,这只是Visual Studio Specific。在Linux机器上 - 只需要一次安装

相关问题