c++项目中引入xgboost静态库

Posted Q博士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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了。

以上是关于c++项目中引入xgboost静态库的主要内容,如果未能解决你的问题,请参考以下文章

如何将本机 C++ 静态库链接到托管 C++ 程序集

iOS导入c++语言的静态库之后编译不过,先要检查是否导入了libstdc++

将静态库添加到 C 或 C++ 项目的常用方法是啥?

如何在我的 C++ 项目中链接本地安装的 SDK 的静态库?

Visual C++:从 DLL 调用时 XGBoost 不起作用

Visual Studio C++:在另一个项目中使用一个项目生成的静态库