#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 ? PimplIdiom5. Ха-ха.. Забавно, что, когда я как раз собирался написать «Ура! Ибо я нашел путь Прыщавого «.
Ответ №1:
Поскольку вы хотите скрыть тот факт, что вы используете xn
пространство имен в своей реализации, вам не следует помещать это в файл заголовка библиотеки. Самый простой способ решить эту проблему — использовать идиому pimpl.