Предупреждение компилятора C4251: проблема с экспортом класса в *.dll

#c #dll #dllexport #kinect

#c #dll #dllexport #kinect

Вопрос:

РЕДАКТИРОВАТЬ: Простите за мою тупость, я никогда раньше не реализовывал wrapper .dll! :S

Я немного повозился с некоторыми недавно выпущенными взломами датчиков Kinect (а именно, с 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, чтобы скрыть базовую реализацию, это неправильно?

Комментарии:

1. Читать en.wikipedia.org/wiki/Opaque_pointer

2. Вы сделали #include "stdafx.h" в заголовке библиотеки?

3.Нет, это в LibKinect.cpp файле, как и должны быть предварительно скомпилированные заголовки. Я вижу, где я ошибаюсь; тот факт, что у меня есть объекты в xn:: пространстве имен в LibKinect.h файле, которые затем включает клиентское приложение и понятия не имеет, что, черт возьми, xn:: такое. Однако я все еще немного сбит с толку относительно того, как лучше это исправить.

4. @Siyfion: Да .. не очень хорошая идея помещать stdafx.h include в файл заголовка. Самый простой способ решить эту проблему — использовать идиому pimpl. Проверьте здесь: c2.com/cgi/wiki ? PimplIdiom

5. Ха-ха.. Забавно, что, когда я как раз собирался написать «Ура! Ибо я нашел путь Прыщавого «.

Ответ №1:

Поскольку вы хотите скрыть тот факт, что вы используете xn пространство имен в своей реализации, вам не следует помещать это в файл заголовка библиотеки. Самый простой способ решить эту проблему — использовать идиому pimpl.