最近在研究LSH(局部敏感哈希,local sensitive hash),在海量数据检索中是一个很有效的方法。在音乐检索、图片检索中有着广泛的应用。网上有一个非常好的开源的工具包LSHKIT,大牛们写好了省的我们自己再编写,而且从它的源码中可以学到很多。源码主页在这里http://lshkit.sourceforge.net/
编译这个源码花了我一整天的时间,现在将过程记录之。
我的电脑配置:64位win7, 64位VS2010
步骤一:其它依赖库编译
1. 首先你的电脑需要编译好boost库,配置见这篇博文http://blog.csdn.net/dupei/article/details/6110153
2. 还需要编译gsl数学库,见这篇博文http://www.cnblogs.com/suda/archive/2012/03/03/2378644.html
(以上两个库比较常用,我之前就已经编译好了)
步骤二:编译准备
3. 下载cmake,这是一个跨平台编译的工具,无论是windows还是linux系统,用cmake都会生成相应的工程文件。我是VS2010下,所以运行cmake后会生成.sln工程文件。下面讲具体步骤。
(1)新建一个文件夹,如%GSL_ROOT_DIR%, 把gsl的include文件夹和编译好的lib文件夹放进去(lib文件一定要注意是64位or32位,Debug or Release, 否则会出链接错误)
(2)把LSHKIT中的FindGSL.cmake复制到cmake文件夹中的share/cmake-xxx/Modules中。这样能使得cmake时候找到gsl路径。
(3)新建一个文件夹,如%BOOST_DIR%, 把boost中的include文件夹和编译好的lib文件夹放进去(lib文件一定要注意是64位or32位,Debug or Release, 否则会出链接错误)
(说明,你会发现在cmake文件夹中的share/cmake-xxx/Modules中发现FindBoost.cmake)
(4)把%GSL_ROOT_DIR%; %BOOST_DIR%; %BOOST_DIR%\include; %BOOST_DIR%\lib; 添加为环境变量(我之前按照官网说明,没添加\include和\lib,导致出错)
步骤三:编译LSHKIT库
下面开始生成。LSHKIT中的src和tools需要分两次生成不同的工程文件(你会发现src和tools文件夹中各有一个CMakeLists.txt,即是此意)
(1)打开cmake-gui.exe,"where is the source code"选择%LSHKIT_DIR%\src,"where to build the binaries"选择你想要存放工程的文件夹
(2)点Configure按钮,选择目标编译环境,我选的是Visual Studio 10 2010 Win64,如果您是不同的编译环境,请相应选择。点Finish。
(3)点Generate按钮,生成了很多文件,包含Project.sln工程。
(4)打开Project.sln工程,项目->属性->配置管理器,选好Release还是Debug。
(5)把lshkit库和gsl库的头文件拷过来,路径配好。编译。
(6)编译会有一些错误,如下
1)提示M_PI未定义错误,解决:在spectral-hash.h中添加 #define M_PI 3.14159265358979323846
2)提示无法找到values.h,解决:用float.h替代。
3)kdtree.c会报上一堆错,解决:右击解决方案资源管理器中kdtree.c属性,编译为一项改为"编译为C++代码(/TP)"
(7)再编译通过。若出现链接错误,请检查gsl.lib与工程的Release or Debug是否一致、32位 or 64位是否一致;或是否成功添加了.lib文件。这时生成了lshkit.lib。编译完毕。
步骤四:调用LSHKIT库
LSHKIT文件夹中tools中的cpp文件是调用lshkit.lib的一些示例。下面这些文件的编译方法。
(1)打开cmake-gui.exe,"where is the source code"选择%LSHKIT_DIR%\tools,"where to build the binaries"选择你想要存放工程的文件夹
(2)同步骤三(2),出现warning不必理会。
(3)同步骤三(3)
(4)同步骤三(4)
(5)以编译apost-run子工程为例。把lshkit库头文件拷过来,路径配好。
(6)把gsl库的lib,lshkit.lib,boost库中program_options的lib拷过来,路径配好。
(7)编译通过。若出现链接错误,请检查gsl.lib与工程的Release or Debug是否一致、32位 or 64位是否一致;或是否成功添加了.lib文件。
若编译成功的话,恭喜!大功告成!
官网上有audio.tar.gz数据可供测试。
参考:
http://lshkit.sourceforge.net/index.html(官网说明)
http://blog.sina.com.cn/s/blog_682b828701017h3l.html(博友配置笔记)
http://blog.csdn.net/lxhlong/article/details/8049712(博友配置笔记)
http://blog.sina.com.cn/s/blog_5f2c831b0100tklb.html(博友配置及学习笔记)