编译使用Shark

Shark是c++机器学习的库,提供了较好的抽象,用起来感觉跟我设想的ML差不多
另一个c++机器学习库是mlpack,但是依赖项较多,而且用起来感觉不是很对付
所以结论就是用Shark了

一、编译

先去官网下载源码。https://www.shark-ml.org
需要安装CMake,并且要把boost库配置并编译好

进入CMake-GUI,选择代码文件和build folder,然后config

然后是一些build选项
需要boost库,所以要指定位置,如果装boost时安装到了默认位置(如图,用homebrew装的),那么就会自动找到。对window而言因为没有默认位置所以必然需要手动设置
Mac上不支持OpenMP,线性代数库使用的是Accelerate,这些都自动找到

然后是一些需要手动调整的地方
不需要build sample和test
一般来说build成static库,这是默认选项。但是boost默认用的却是dynamic,所以要手动勾选

这时会发现上面跟boost有关的选项用的库都是dylib,所以要重新config一次

另外因为mac上没有OpenMP所以对应选项要取消

重新config后boost用的库就变为.a文件了。
然后generate

此时build folder就会有xcode project,打开,将ALL_BUILD调整为release,然后编译

二、搭建工程

虽然编译库很容易,但是要在项目中使用却费功夫
官方推荐的是使用cmake生成工程文件,不过因为我要用的项目是其他库cmake出来的,所以只能手动添加并设置shark库
最终搞出来是build example然后参考example的程序是如何设置的

(1)头文件
下载的包里有一个include,这是需要包含的头文件。然而仅有这个还不够
CMake后在目标文件夹里还有一个include文件夹,内容是shark/Core/Shark.h,推测这个是根据CMake选项生成的头文件,也是需要的
可以在search path里添加两个文件夹,或者把这个Shark.h拷贝出来与其他头文件合并
工程里指定到include即可

还需要添加boost的头文件

(2)库
因为是CMake生成的所以链接库需要在other linker flag里添加,内容有:
/…/libshark.a
/usr/local/lib/libboost_serialization-mt.a
/usr/local/lib/libboost_filesystem-mt.a
/usr/local/lib/libboost_system-mt.a
-framework
Accelerate
因为使用了boost库,而且有些库不仅仅是头文件,所以要手动添加
使用了mac的线性代数库,这个通过-framework的方式添加
当然还有shark库自身

注:这个仅仅是在mac下的选项,在windows下肯定有其他的设置方法
建议build example然后照葫芦画瓢

再编译就可以了