c++項目中引入xgboost靜態庫

參考文章
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了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章