编译器警告C4251:在*.dll中导出类时出现问题

Compiler Warning C4251: Problem exporting a class in a *.dll

本文关键字:问题 dll C4251 警告 编译器      更新时间:2023-10-16

编辑:原谅我的笨拙,我以前从来没有实现过包装器。dll !: S

我一直在修补一些最近发布的Kinect传感器hack(即OpenKinect和OpenNI),我现在正试图将功能包装在一个*.dll中,以便在我希望编写的各种"测试"程序中使用。

到目前为止,我已经建立了一个*.dll项目,并获得了很多库功能,但是我得到C4251编译器警告到处都是。

在项目设置中,我已经静态链接了OpenNI.lib文件,到目前为止我的库头看起来像这样:

#ifdef LIBKINECT_EXPORTS
#define LIBKINECT_API __declspec(dllexport)
#else
#define LIBKINECT_API __declspec(dllimport)
#endif
// This class is exported from the LibKinect.dll
class LIBKINECT_API CLibKinect
{
public:
    CLibKinect(void);
    ~CLibKinect(void);
    bool Init(void);
protected:
private:
    xn::Context                     m_xContext;
    xn::DepthGenerator              m_xDepthGen;
};

和我的stdafx.h文件包含:

#pragma once
#define WIN32_LEAN_AND_MEAN             // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <XnOpenNI.h>
#include <XnCodecIDs.h>
#include <XnCppWrapper.h>

现在我试图创建一个windows控制台应用程序来测试库,我得到了很多error C2653: 'xn' : is not a class or namespace name错误。我希望在应用程序中,我只需要包含并链接到包装器*.dll而不是所有的OpenNI的东西,以便隐藏底层实现,这是不正确的吗?

由于您想要隐藏在实现中使用xn名称空间的事实,因此不应该将其放在库头文件中。解决这个问题最简单的方法是使用粉刺习语。