可视C++:XGBoost 从 DLL 调用时不起作用
Visual C++ : XGBoost does not work when called from a DLL
我需要在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
我下载了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 项目,但适用于控制台应用程序,这真的让我的头撞在键盘上。
您的帮助将不胜感激。
最好 戴夫
在CristiFati的帮助下,我相信这个问题已经得到了解答。 无论出于何种原因,似乎在 DLL 项目中将 XGBoost 与C++一起使用需要额外的包含,而不是在控制台应用程序中使用它所需的内容。
我目前正在构建 DLL 项目,并添加以下内容:
#include <cstdint>
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么 zlib 放气初始化调用一次不起作用?
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 可视C++:XGBoost 从 DLL 调用时不起作用
- C++函数调用不起作用
- 为什么在调用 memcpy 到 bool 值后 memcpy 到 int 不起作用
- 调用填充我的主体数组的函数不起作用
- 功能调用不起作用,但控制台仍允许输入
- 可以't更改船舶位置,函数调用不起作用
- 函数调用不起作用,矢量访问数据
- 函数调用不起作用
- 析构函数体内的函数调用不起作用
- boost库更新后,模板函数调用不起作用
- 简单的 JNI 调用不起作用
- 静态函数调用不起作用 (C++)
- 调试从 C# 到 C++/CLI 到 C++ 的函数调用不起作用
- 带有SIGTERM的kill()系统调用不起作用
- 对 R 的子顺序 C 调用不起作用
- 显式析构函数调用不起作用
- 日期函数调用不起作用