問題背景
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了。