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

时间:2018-08-06 22:31:16

标签: c++ visual-studio dll xgboost

我要求在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

  1. 我下载了XGBoost源,并使用CMake和Visual Studio 2015进行了构建。

  2. 在“项目”>“链接器”>“输入”>“其他依赖项”下, 我添加了xgboost.lib文件

  3. 在项目下>链接器>常规>其他库目录 我添加了对... \ xgboost \ build \ Release

  4. 的引用
  5. 在项目下> VC ++目录>包括目录 我将路径添加到... \ xgboost \ rabit \ include和... \ xgboost \ include

  6. 我将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项目不起作用,但对于控制台应用程序却确实起作用,我确实将我的头撞到了键盘上。

非常感谢您的帮助。

最好, 戴夫

1 个答案:

答案 0 :(得分:0)

在CristiFati的帮助下,我相信此问题已得到解答。 无论出于何种原因,似乎在DLL项目中将XGBoost与C ++一起使用都需要在控制台应用程序中使用它以外的其他内容。
我目前正在构建DLL项目,并添加了以下内容:
#include <cstdint>