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

Visual C++ : XGBoost does not work when called from a DLL

本文关键字:调用 不起作用 DLL C++ XGBoost 可视      更新时间:2023-10-16

我需要在Visual C++项目DLL中使用XGBoost。 我已经能够使用 VC++ 和 CMake 下载和构建 XGBoost 源代码。

当我在测试控制台应用程序中包含 XGBoost 代码时,它工作正常。

但是,当我尝试在 DLL 项目中复制我对控制台应用程序执行的操作时,它将无法编译。 我甚至正在努力在项目中使用基本的 XGBoost 类型。

我怀疑问题是我对DLL项目的无知,感谢您的帮助。

以下是我的 DLL 项目中发生的情况: 当我使用以下包含作为 cpp 类文件中的第一行时,它会编译:
#include <xgboostc_api.h>

编译后,如果我尝试使用此包含文件中定义的简单类型,则构建将失败并显示以下消息:
...\dll_test\xgb_driver.cpp(20(:错误 C2065:"BoosterHandle":未声明的标识符

这是导致错误的行:
BoosterHandle my_handle;

"BoosterHandle"实际上是在<xgboostc_api.h>中定义的

当我将包含放在任何其他包含下方时,我收到以下错误消息:
1>c:\tools\src\xgboost\include\xgboost\c_api.h(29(:错误 C4430:缺少类型说明符 - 假定为 int。注意:C++不支持默认整数

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. 在"项目> VC++ 目录"下>"包含目录" 我添加了路径...\xgboost\rabit\include和...\xgboost\include

  5. 我把 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 项目,但适用于控制台应用程序,这真的让我的头撞在键盘上。

您的帮助将不胜感激。

最好 戴夫

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