我要求在Visual C ++项目DLL中使用XGBoost。 我已经能够使用VC ++和CMake下载并构建XGBoost源代码。
当我在测试控制台应用程序中包含XGBoost代码时,它可以正常工作。
但是,当我尝试在DLL项目中复制对控制台应用程序所做的操作时,它将无法编译。 我甚至在项目中都使用基本的XGBoost类型。
我怀疑问题出在我对DLL项目的无知,希望您的帮助。
这是我的DLL项目中正在发生的事情:
当我将以下include用作cpp类文件的第一行时,它会编译:
#include <xgboost\c_api.h>
通过编译,如果我尝试使用此包含文件中定义的简单类型,则构建失败并显示以下消息:
... \ dll_test \ xgb_driver.cpp(20):错误C2065:'BoosterHandle':未声明的标识符
这是导致错误的行:
BoosterHandle my_handle;
“ BoosterHandle”实际上是在<xgboost\c_api.h>
中定义的
当我将include放在任何其他include的下面时,会出现以下错误消息:
1> c:\ tools \ src \ xgboost \ include \ xgboost \ c_api.h(29):错误C4430:缺少类型说明符-假定为int。注意:C ++不支持default-int
1> c:\ tools \ src \ xgboost \ include \ xgboost \ c_api.h(29):错误C2146:语法错误:缺少';'在标识符“ bst_ulong”之前
以下是有关使XGBoost与控制台应用程序一起工作以及我如何创建DLL项目的更多信息。
=-=-=-=-=-=
这是我将XGBoost与控制台配合使用的方法。关于它的一切似乎都可以正常工作。我已经测试了模型预测,它们是 与我在R中看到的一致。
使用在此处找到的文档: https://xgboost.readthedocs.io/en/latest/build.html
我下载了XGBoost源,并使用CMake和Visual Studio 2015进行了构建。
在“项目”>“链接器”>“输入”>“其他依赖项”下, 我添加了xgboost.lib文件
在项目下>链接器>常规>其他库目录 我添加了对... \ xgboost \ build \ Release
在项目下> VC ++目录>包括目录 我将路径添加到... \ xgboost \ rabit \ include和... \ xgboost \ include
我将xgboost.dll放在生成.exe的目录中。
从这里开始,航行顺利。
=-=-=-=-=-=
这是我创建Visual C ++ DLL项目所要做的:
选择“文件”>“新建”>“项目”后,我选择一个ATL DLL项目(这是项目要求的一部分)。
对于XGBoost包含到项目中,我重复了上面的步骤1-5,但是将xgboost.dll文件放在 将生成项目DLL。
以下是我创建的简单类的头文件的来源:
#pragma once
class XGB_Driver
{
public:
XGB_Driver();
~XGB_Driver();
float callXGB(float sample_input);
};
以下是简单cpp文件的来源:
#include <xgboost/c_api.h>
#include "stdafx.h"
#include "XGB_Driver.h"
XGB_Driver::XGB_Driver()
{
}
XGB_Driver::~XGB_Driver()
{
}
float XGB_Driver::callXGB(float simple_input) {
BoosterHandle my_handle;
return(0);
}
为什么这对于ATL DLL项目不起作用,但对于控制台应用程序却确实起作用,我确实将我的头撞到了键盘上。
非常感谢您的帮助。
最好, 戴夫
答案 0 :(得分:0)
在CristiFati的帮助下,我相信此问题已得到解答。
无论出于何种原因,似乎在DLL项目中将XGBoost与C ++一起使用都需要在控制台应用程序中使用它以外的其他内容。
我目前正在构建DLL项目,并添加了以下内容:
#include <cstdint>