Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Librería con único include

Iniciado por marcode, 31 de Mayo de 2007, 10:06:42 PM

« anterior - próximo »

marcode

Tengo una librería gráfica en C++, pero me gustaría poder agruparla y usarla estáticamente pero sin todo el follón de includes, y poder recopilar en uno solo todas las clases y métodos, pero no tengo ni idea porque nunca lo hice.

¿Cómo se suele hacer eso?, ¿hay algún programa que lo haga automáticamente?.

El que haga librerías de clases supongo que sabrá a qué me refiero. No quiero agrupar todos los includes en uno solo si no seleccionar lo esencial para poder usar la librería. Los métodos y poco más.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Astat

Yo tengo un solo .h que es lo unico que necesitan incluir las aplicaciones basadas en mi motor. Es del estilo a esto:


#pragma once

//! ZGE Includes
#include "iBase.h"
#include "iApplication.h"
#include "iTask.h"
#include "iLogger.h"
#include "iResourceManager.h"
#include "iErrorHandler.h"
#include "iInput.h"
#include "iVideo.h"
#include "iPhysic.h"
#include "iTexture.h"
#include "iMaterial.h"
#include "iSprite.h"
#include "iStaticGeometry.h"
#include "iSceneNode.h"
#include "iScene.h"
#include "iRenderableNode.h"
#include "iCameraNode.h"
#include "iGeometryNode.h"
#include "iLightNode.h"
#include "iPhysic.h"

//! Namespace de Z Game Engine
namespace zge
{
 //! Comienzo
 ZGE_API int Start(void *pNewApp,
   uint nHResolution = 800,
   uint nVResolution = 600,
   const std::wstring &strAppName = L"Z Engine Application",
   LPSTR strCmdLine = NULL);

 // ... demas funciones basicas...
}


//! EntryPoint
#define ENTRYPOINT(a, b, c, d)                                          \
 INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT) \
 {                                                                     \
   a *pApp = new a;                                                    \
   zge::Start(pApp, b, c, d, strCmdLine);                              \
   return 0;                                                           \
 };


Este .h solo lo incluyen las aplicaciones. El unico "engorro" es que si metes cosas nuevas, tienes que meter el .h en este archivo... tampoco es demasiado molesto no?

marcode

Sí, si así es como tengo pensado pero el problema es que tienes que ir con toda la traca de includes acompañando a un único lib.

La idea era meter todo lo necesario como hacen con directx, donde por ejemplo d3d9.h tiene declaraciones de este tipo


DECLARE_INTERFACE_(IDirect3D9, IUnknown)
{
   /*** IUnknown methods ***/
   STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
   STDMETHOD_(ULONG,AddRef)(THIS) PURE;
   STDMETHOD_(ULONG,Release)(THIS) PURE;

   /*** IDirect3D9 methods ***/
   STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE;
   STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE;
   STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE;
   STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE;
   STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE;
   STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE;
   STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE;
   STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE;
   STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE;
   STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE;
   STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE;
   STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE;
   STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE;
   STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;
   
   #ifdef D3D_DEBUG_INFO
   LPCWSTR Version;
   #endif
};


Es como si sólo hubieran metido los métodos, pero tampoco sé muy bien de que va todo este rollo y si tendrá algo que ver con lo que yo puedo o quiero hacer.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

Astat

El uso de DECLARE_INTERFACE y STDMETHOD_ solo te ahorra escribir un poco mas, pero al fin y al cabo lo que estas haciendo es definir todas las clases que quieres exportar en un solo .h.

Asi que al final es solo cuestion de gustos. Que prefieres, da un monton de Hs pero mas ordenado todo? o dar solo un "mega" H?

marcode

Pues me interesaría tener todo en un megaH únicamente, que pueda usar la librería únicamente con un .lib y un .h, excluyendo propiedades y métodos que no se usen o estén en construcción, comentarios y demás pijadas que sólo sirvan para crear la librería, pero no para usarla.

A ver si hay alguien que sepa como hacerlo.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

shephiroth

La unica solucion que se me ocurre, es que a mano copy&pastees todos tus .h en un solo .h (y los .c incluyan ese superH). Lo que no se si esto te permitiria tener un solo .lib o si necesitaras un .lib por cada .c (no tengo ni idea de .lib, asi que mejor no digo nada xDD).

Para lo que comentas de poder "elegir" que es lo que quieres incluir, te podrías crear unas reglas de macros para excluir. Por ejemplo, en el .h grande pones:

#ifndef MICLASE_FUNCIONA_EXCLUIR
...aqui declaras la funcion
#else
...aqui podrías declarar declarar la funcion pero que saltase error visual
#endif

De esta manera, si en algun momento no quieres incluir alguna funcion con definir esa constante antes del include sería suficiente ^^

marcode

Estoy declarando a mano en un .h las clases y los métodos públicos mediante interface, pero al hacerlo sobre una clase concreta, al ejecutar un programa que usa la librería, me salta un error de excepción, concretamente "access violation reading location". Al depurar veo efectivamente que es porque se corrompen los datos.

¿Alguien ha usado esta forma de declarar clases?, ¿alguna sugerencia?
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

marcode

Ya sé donde está el problema, el constructor de la clase asociada no es llamado.

¿Alguien sabe cómo solucionarlo?
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

shephiroth

Constructor de una clase desde una libreria.......me suena que hace poco comentaron que de una libreria puedes importar la clase y sus metodos, pero no puedes instanciar desde fuera de la libreria. Creo que la solucion andaba en crear una funcion (posiblemente estatica) que instancie una nuevo objeto de esa clase. De esta manera al instanciarse desde la libreria no hay problema ^^

SUERTE

marcode

Vaya, pues eso me va a obligar a hacer una remodelación general. Ya no sé si me interesa, o si tendré más inconvenientes.

De todos modos supongo que tendrían que ser funciones aparte para instanciar los objetos, porque me parece que no se pueden declarar miembros estáticos en interfaces.

A ver si alguien sabe un poco más del tema. Intentaré informarme un poco más antes de meterme a saco con ello.

De todos modos, no sé si te he entendido bien pero yo no tengo problema en usar la librería desde el exterior usando los .h originales, el constructor es llamado y todo funciona correctamente. El problema es al declararlo como una interface, supongo que será por esto por lo que no va bien.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.