參考文章
Using XGBOOST in c++
c++項目引入xgboost動態庫 問題背景
xgboost項目官方沒有提供c_api方式的編譯以及引入教程,所以剛開始我們是用直接把項目源碼引入到我們的項目中,非常麻煩。
剛開始我們以源碼的方式匯入到項目中,調用原始碼的方法中,代碼寫的非常冗餘,而且一些api不能為我們所用。所以總想著如何直接引入xgboost的靜態庫。
由於我們使用的是blade構建工具,所以第一步使用製作blade規則的xgboost項目。 源碼編譯
https://github.com/dmlc/xgboost
安裝官方文檔下載github源碼,編譯,然後在會產生如下3個靜態檔案已經3個include檔案夾,我們就需要這些東西。 xgboost/lib/libxgboost.a xgboost/include/ xgboost/rabit/lib/librabit.a xgboost/rabit/include xgboost/dmlc-core/libdmlc.a xgboost/dmlc-core/include 建立blade工程
建立檔案夾sfxgboot,把剛才的3個靜態檔案,存放到sfxgboost/lib/目錄下,把include檔案夾存放到sfxgboost/include/目錄下。
建立BUILD檔案,內容如下:
cc_library( name = 'sfxgboost', optimize = ['O2', 'std=c++11','fopenmp'], export_incs = ['include'], deps = [ ':xgboost', ':rabit', ':dmlc', ])cc_library( name = 'xgboost', prebuilt = True,)cc_library( name = "dmlc", prebuilt = True,)cc_library( name = "rabit", prebuilt = True,)
上面的.a檔案引入的順序是有要求的,不能更改。 其他項目引入
xgboost作為靜態庫的項目已經建立完成,那麼開發項目如何引入呢。很簡單,在你的項目BUILD加入如下代碼:
cc_binary( name = 'test', optimize = ['O2', 'std=c++11','g'], extra_linkflags = [ '-fopenmp' ], srcs = [ ... ], incs = [ ... ], deps = [ '#dl', '#z', '#rt', '#crypto', '#ssl', '//BUILD_ROOT/sfxgboost:sfxgboost', ],)
然後在需要調用api的標頭檔中添加如下代碼
#include "xgboost/c_api.h"
就可以調用c_api了。