2011-04-12 3 views
1

EDIT : 내 noobish-ness를 용서하십시오. 이전에 래퍼 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> 

지금은 ' ve는 라이브러리를 테스트하기 위해 Windows 콘솔 앱을 만들려고했는데 error C2653: 'xn' : is not a class or namespace name 오류가 많이 발생했습니다. 나는 응용 프로그램에서 래퍼 * .dll을 모두 포함하고 링크해야만한다는 사실을 알고 있었기 때문에 기본 구현을 숨기려면 OpenNI의 모든 내용이 아닌가?

+1

http://en.wikipedia.org/wiki/Opaque_pointer 읽기 – Erik

+0

라이브러리 헤더에'#include "stdafx.h"'를 했습니까? – Asha

+0

미리 컴파일 된 헤더가 있어야하므로'LibKinect.cpp' 파일에 없습니다. 나는 내가 잘못 가고있는 곳을 본다. 클라이언트 응용 프로그램에 포함 된'LibKinect.h' 파일의'xn ::'네임 스페이스에 객체가 있고 사실 xn ::'** **이 무엇인지 알지 못합니다. 그러나이 문제를 해결하는 가장 좋은 방법에 대해서는 아직 조금 혼란 스럽습니다. – Siyfion

답변

1

구현시 xn 네임 스페이스를 사용한다는 사실을 숨기려면 라이브러리 헤더 파일에 해당 이름을 두어서는 안됩니다. 이 문제를 해결하는 가장 간단한 방법은 pimpl idiom을 사용하는 것입니다.

관련 문제