PDA

Visualizza la versione completa : [c++]win dll e lib


giuseppe500
21-02-2010, 15:49
Ciao.
Dove sta la differenza tra usare le dll e i .lib ?
Se ho una dll devo avere anche un file di definizione delle funzioni giusto?
Ho scaricato uno zip contenente Devil(un programma per gestire le immagini) ma ha solo 3 dll , come faccio ad avere il .h per richiamare le funzioni?
Ce n' bisogno o si fa senza ?
Scusate l'ignoranza.
ciao.

oregon
21-02-2010, 16:03
Originariamente inviato da giuseppe500
Dove sta la differenza tra usare le dll e i .lib ?

Le DLL sono librerie dinamiche, utilizzate "a runtime" dai programmi.

Le LIB sono librerie statiche, utilizzate nella fase della compilazione in modo che un programma possa

1) conoscere ed importate nomi/argomenti delle funzioni da poi chiamare nelle DLL (avendo il .h)

oppure

2) inserire direttamente nell'eseguibile finale il codice delle funzioni stesse in modo da essere eseguito senza DLL (sempre con il .h)

La LIB non necessaria perch puoi anche caricare ed usare "dinamicamente" la DLL, quando ti serve, anche per una singola funzione. Naturalmente devi conoscere nome/parametri delle funzioni ...


Se ho una dll devo avere anche un file di definizione delle funzioni giusto?

Per fare cosa?


Ho scaricato uno zip contenente Devil(un programma per gestire le immagini) ma ha solo 3 dll , come faccio ad avere il .h per richiamare le funzioni? Ce n' bisogno o si fa senza ?

Se non hai altro, ovviamente non te ne fai nulla delle DLL. In questo modo hai solamente il supporto "run time" per un programma che utilizza le DLL, non puoi "sviluppare" nulla ...


Scusate l'ignoranza.


Purtroppo sono argomenti abbastanza vasti che prevedono delle "basi" e un po' di conoscenza dei sistemi ... non si pu esaurire tutto in una risposta in un forum ...

giuseppe500
21-02-2010, 16:21
Grazie Oregon , scusa se ti disturbo ma devo capire una cosa:
Se creo una libreria .lib(libA) che ha delle dipendenze da altre .lib ,e includo come lib(nel pannello link di visual studio)questa libreria(sempre libA) in un applicazione App1, devo includere ancora una volta tutte le librerie utilizzate da libA?
Come si procede?
Grazie.

oregon
21-02-2010, 16:30
Originariamente inviato da giuseppe500
Grazie Oregon , scusa se ti disturbo ma devo capire una cosa:
Se creo una libreria .lib(libA) che ha delle dipendenze da altre .lib ,e includo come lib(nel pannello link di visual studio)questa libreria(sempre libA) in un applicazione App1, devo includere ancora una volta tutte le librerie utilizzate da libA?
Come si procede?
Grazie.

No ... non dovresti.

giuseppe500
21-02-2010, 16:43
il fatto che ho compilato una libreria (.lib) con delle dipendenze (alla fine della compilazione mi si crea un .lib).
Ho incluso in un altro progetto questa libreria , ma ottengo questi errori:
1>Linking...
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilGetData@0 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilGetInteger@4 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilConvertImage@8 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilDeleteImages@8 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilLoadImage@4 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilGenImages@8 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilutInit@0 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__iluInit@0 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>Wm4Graphics90d.lib(ImageEx.obj) : error LNK2019: unresolved external symbol __imp__ilInit@0 referenced in function "public: class ImageEx * __thiscall ImageEx::Load(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?Load@ImageEx@@QAEPAV1@ABV?$basic_string@DU?$char _traits@D@std@@V?$allocator@D@2@@std@@_N@Z)
1>C:\programmazione\wild magic 4\GeometricTools\WildMagic4\Builds\Builds\Debug\te st.exe : fatal error LNK1120: 9 unresolved externals
1>Build log was saved at "file://c:\programmazione\wild magic 4\GeometricTools\WildMagic4\Builds\Builds\test\Deb ug\BuildLog.htm"
1>test - 10 error(s), 0 warning(s)


questo imageex.h:


#include "wm4image.h"
#include "il/il.h"
#include <string>
class ImageEx : Wm4::Image
{
public:
ImageEx(void);
~ImageEx(void);
ImageEx* Load (const std::string& rkImageName, bool bAbsolutePath);
};


e questo il .cpp


#include "Wm4GraphicsPCH.h"
#include "ImageEx.h"
#include <string>
#include "il/Il.h"

ImageEx::ImageEx(void)
{
}

ImageEx::~ImageEx(void)
{
}

ImageEx* ImageEx::Load(const std::string& rkImageName, bool bAbsolutePath)
{

ilInit();
iluInit();
ilutInit();
ILuint imageID = -1;
ILboolean imageLoaded;

GLuint width;
GLuint height;
GLuint bpp;
GLuint format;

ilGenImages( 1, &imageID );


imageLoaded = ilLoadImage( rkImageName.c_str() );

if ( !imageLoaded )
{
ilDeleteImages( 1, &imageID );
return false;
}
else
{
imageLoaded = ilConvertImage( IL_RGBA, IL_UNSIGNED_BYTE );

if ( !imageLoaded )
{
ilDeleteImages( 1, &imageID );
return false;
}

width = ilGetInteger( IL_IMAGE_WIDTH );
height = ilGetInteger( IL_IMAGE_HEIGHT );
bpp = ilGetInteger( IL_IMAGE_BPP );
format = ilGetInteger( IL_IMAGE_FORMAT );

int IMGWidth, IMGHeight;

IMGWidth = (int)width;
IMGHeight = (int)height;
m_aucData = (unsigned char*) ilGetData();
}
return this;
}


tutte le chiamate a funzioni danno un link error , mentre i tipi no.
Ribadisco che questo compila e genera la libreria, solo se la inserisco in un altro progetto e compilo ho gli errori di sopra .

Questo l'altro progetto:


#include "stdafx.h"
#include "IL/Il.h"
#include "imageex.h"
using namespace Wm4;

int _tmain(int argc, _TCHAR* argv[])
{
ImageEx* im = new ImageEx();
return 0;
}

giuseppe500
21-02-2010, 19:01
Se puo essere d'aiuto sto lavorando su un engine grafico gia fatto e utilizza dei file .inl dove sono definite le funzioni inline del tipo:


//----------------------------------------------------------------------------
inline Image::FormatMode Image::GetFormat () const
{
return m_eFormat;
}
//----------------------------------------------------------------------------
inline const std::string& Image::GetFormatName () const
{
return ms_akFormatName[m_eFormat];
}

includi in dei .h
Cosa sono e a cosa servono queste funzioni inline?
Il progetto produce una lib o una dll a seconda delle scelte di compilazione precisamente debug , debugdll, release, releasedll
ma sono necessarie tutte e 2 per utilizzare la library e lanciare l'eseguibile generato.

Loading