2011-04-12 88 views
1

編輯:原諒我的不高興,我從未實現過一個包裝器.dll! :S編譯器警告C4251:在* .dll中導出類時出現問題

我一直在擺弄了一下一些最近發佈的Kinect感應器的黑客(即OpenKinectOpenNI),現在我想在* .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錯誤。我希望在應用程序中,我只需要包含並鏈接到wrapper * .dll而不是所有的OpenNI東西,以隱藏底層實現,這是不正確的?

+1

閱讀http://en.wikipedia.org/wiki/Opaque_pointer – Erik 2011-04-12 10:56:21

+0

您是否已經在庫標頭中完成了#include「stdafx.h」的操作? – Asha 2011-04-12 11:05:08

+0

不,它是在'LibKinect.cpp'文件中,因爲預編譯的頭文件必須是。我明白我要去哪裏錯了;我在'LibKinect.h'文件中的'xn ::'命名空間中存在對象,客戶端應用程序隨後包含這些對象,並且不知道'xn ::'**是什麼**。不過,對於如何最好地解決這個問題,我仍然有點困惑。 – Siyfion 2011-04-12 11:15:41

回答

1

既然要隱藏你正在使用xn命名空間在您的實現的事實,你不應該把庫中的頭文件。解決這個問題最簡單的方法是使用pimpl idiom