C++ visualc&x2B+;:从DLL调用XGBoost时不起作用
我有一个要求,在VisualC++项目DLL中使用XGBooP。 我已经能够使用VC++和CMake下载并构建XGBoost源代码 当我在测试控制台应用程序中包含XGBoost代码时,它可以正常工作 然而,当我尝试在DLL项目中复制我对控制台应用程序所做的操作时,它不会编译。 我甚至很难在项目中使用基本的XGBoost类型 我怀疑问题在于我对DLL项目的无知,并感谢您的帮助 下面是我的DLL项目中发生的情况: 当我使用以下include作为cpp类文件的第一行时,它会编译:C++ visualc&x2B+;:从DLL调用XGBoost时不起作用,c++,visual-studio,dll,xgboost,C++,Visual Studio,Dll,Xgboost,我有一个要求,在VisualC++项目DLL中使用XGBooP。 我已经能够使用VC++和CMake下载并构建XGBoost源代码 当我在测试控制台应用程序中包含XGBoost代码时,它可以正常工作 然而,当我尝试在DLL项目中复制我对控制台应用程序所做的操作时,它不会编译。 我甚至很难在项目中使用基本的XGBoost类型 我怀疑问题在于我对DLL项目的无知,并感谢您的帮助 下面是我的DLL项目中发生的情况: 当我使用以下include作为cpp类文件的第一行时,它会编译: #包括 在编译时,如
#包括
在编译时,如果尝试使用此include文件中定义的简单类型,则生成将失败,并显示以下消息:…\dll\u test\xgb\u driver.cpp(20):错误C2065:“BoosterHandle”:未声明的标识符 这是导致错误的行:
BoosterHandle我的手柄代码>
“BoosterHandle”实际上是在
当我将include放在任何其他include下面时,会收到以下错误消息:
1> c:\tools\src\xgboost\include\xgboost\c_api.h(29):错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INTBR/>
1> c:\tools\src\xgboost\include\xgboost\c_api.h(29):错误C2146:语法错误:缺少“;”在标识符“bst_ulong”之前
下面是关于如何让XGBoost使用控制台应用程序以及如何创建DLL项目的更多信息
=-=-=-=-=-=-=
下面是我使用XGBoost和控制台所做的。这一切似乎都起作用了。我已经测试了模型预测,它们是正确的
和我在R里看到的一致
使用此处提供的文档:
我下载了XGBoost源代码,并使用CMake和Visual Studio 2015构建了它
在“项目>链接器>输入>其他依赖项”下,
我添加了xgboost.lib文件
在“项目>链接器>常规>其他库目录”下
我添加了对…\xgboost\build\Release的引用
在“项目>VC++目录>包含目录”下
我将路径添加到…\xgboost\rabit\include和…\xgboost\include
我将xgboost.dll放在生成.exe的目录中
从这里开始,一切顺利
=-=-=-=-=-=-=
这是我创建Visual C++ DLL项目的工作:
在选择File>New>Project之后,我选择了一个ATL DLL项目(这是项目需求的一部分)
对于项目中的XGBoost include,我重复了上面的步骤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);
}
#包括
#包括“stdafx.h”
#包括“XGB_Driver.h”
XGB_驱动程序::XGB_驱动程序()
{
}
XGB_驱动程序::~XGB_驱动程序()
{
}
浮点XGB_驱动程序::callXGB(浮点简单_输入){
助推器手柄我的手柄;
返回(0);
}
为什么这对ATL DLL项目不起作用,但对console应用程序起作用真的让我头疼
非常感谢你的帮助
最好的,
Dave在CristiFati的帮助下,我相信这个问题已经得到了回答。
不管是什么原因,在DLL项目中使用C++的XGBoost需要额外的包含,而不是在控制台应用程序中使用它所需的内容。
我目前正在构建DLL项目,添加了:
\include
如果在\include
之前包含,会发生什么?或者更好,如果您将#include“stdafx.h”
移动到#include
s列表的顶部?CristiFati,则xgboost头之前的#include addition似乎解决了问题。我不知道为什么在DLL项目中需要这个,但在控制台项目中不需要,但是,嘿,我接受它。我想让你相信我的回答,但我的选择是要么添加评论,要么回答我自己的问题。非常感谢您的帮助。移动#在顶部包含“stdafx.h”
怎么样?如果仅此一项不起作用,那么应将#include
放在StdAfx.h中。应该这样做。让我知道它是否适用于您,然后我会发布一个带有解释和所有内容的答案。它是有效的,如果您有关于它为什么有效的详细信息,我将非常感激。另一方面,我不理解问题第一部分中的错误,在这一点上构建xgboost对我来说开销太大了。所以,继续回答你自己的问题。