Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ visualc&x2B+;:从DLL调用XGBoost时不起作用_C++_Visual Studio_Dll_Xgboost - Fatal编程技术网

C++ visualc&x2B+;:从DLL调用XGBoost时不起作用

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类文件的第一行时,它会编译: #包括 在编译时,如

我有一个要求,在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对我来说开销太大了。所以,继续回答你自己的问题。