Всем привет.
Ситуация такая: пишу динамическую библиотеку. Нужно чтобы в конечном итоге получилось 2 файла (сама библиотека и заголовочный файл с объявлением функций).
Заголовочный файл:
#ifndef HEADER_H
#define HEADER_H
#ifdef WIN32
#include <windows.h>
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __attribute__((visibility("default")))
#endif
EXPORT Object *GetObject();
#endif // HEADER_H
#include "header.h"
#include "object.h"
#ifdef WIN32
BOOL WINAPI DllMain( HINSTANCE /*hinstDLL*/, DWORD /*fdwReason*/, LPVOID /*lpvReserved*/ )
{
return TRUE;
}
#endif
Object *GetObject()
{
return pObject.GetObject();
}
class Object
{
public:
Object();
Object *GetObject();
};
extern Object pObject;
Object::Object
{
}
Object *Object::GetObject()
{
Object *obj = new Object();
return obj;
}
Object pObject;
Используй forward declaration:
#ifndef HEADER_H
#define HEADER_H
#ifdef WIN32
#include <windows.h>
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __attribute__((visibility("default")))
#endif
class Object;
EXPORT Object *GetObject();
#endif // HEADER_H
В вашем случае такой вариант не прокатит, т.к. в публичном интерфейсе вы возвращаете объект, который не собираетесь поставлять. Необходимо экспортировать класс Object и его заголовок тоже таскать.
примерно так:
class EXPORT Object
{
public:
Object();
Object *GetObject();
};
extern EXPORT Object pObject;
если интерфейс библиотеки работает с классом, то без объявления этого класса компилятор с ним работать не сможет. ему нужно как-то генерить информацию об объекте. так что описание класса всегда должно присутствовать в заголовочниках.
Спасибо всем за разъяснения.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)