c++项目中引入xgboost静态库
Posted Q博士
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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静态库的主要内容,如果未能解决你的问题,请参考以下文章
iOS导入c++语言的静态库之后编译不过,先要检查是否导入了libstdc++
如何在我的 C++ 项目中链接本地安装的 SDK 的静态库?