Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Luokan jakelu - staattinen vai dynaaminen kirjasto?

Tumpelo [13.05.2008 15:00:26]

#

Pitäisi saada tuo tekeillä oleva 3D-engine sellaiseen muotoon että sen pystyisi järkevällä tavalla laittamaan levitykseenkin (vaikka enpä sitä varsinaisesti aio levittää) - ilman varsinaista lähdekoodia. Muuten käyttäisin staattista kirjastoa (.a) mutta ongelmia tulee siitä että käytän sekä OpenGL:ää että SDL:ää. Nehän sisältävät paljon koodia ja omia staattisia kirjastojaan. Onko mitenkään mahdollista tehdä vain yksi tiedosto (libSimple3D.a) ja asiaankuuluva header, jotka sisältäisivät includetut OpenGL-ja SDL-koodit sekä staattiset libraryt? On nimittäin epäkäytännöllistä levittää omaa "itsenäistä" kirjastoaan: "Joo laita tästä tämä headeri ja nuo koodit tonne.. Joo ja sit asenna OpenGL ja SDL ja linkitä niiden libraryt muuten ei toimi.. Nii ja muista laittaa includet ja...".

Sitten olisi kiva tietää miten nuo DLL (tai .SO) kirjastot eroavat staattisesta muutenkin kuin että ne ladataan ohjelman alussa tai suorituksen aikana? Voisiko niistä olla apua?

Metabolix [14.05.2008 21:53:41]

#

DLL ei yksinkertaisimmillaan juuri eroa ohjelmoinnin kannalta, ja hyvänä puolena on, että jos kirjaston rajapinta pysyy samana (eli funktiokutsut eivät muutu), niin mahdolliset päivitykset voi liittää ohjelmaan korvaamalla DLL:n uudella versiolla. Staattiset kirjastot taas vaativat luonnollisesti uuden käännöksen koko ohjelmasta.

Dynaamisia kirjastoja on myös mahdollista ladata kesken ohjelman. 3D-moottorista voi siis vaikkapa tehdä OpenGL- ja DirectX-versiot, jotka toteuttavat saman rajapinnan, ja ladata näistä käyttäjän valinnan mukaan jommankumman ilman, että tiedostoja tarvitsee siirrellä ympäriinsä. Tässä tapauksessa käyttö tosin poikkeaa jo hieman staattisen kirjaston käytöstä.

SDL on mahdollista linkittää staattisesti oman ohjelman (tai DLL:n) mukaan. Tämä vaatii SDL:n staattiset kirjastot yleisempien dynaamisten sijaan, voit joutua kääntämään ne itse. Minusta tosin on järkevämpää käyttää sitä dynaamista tässäkin, säästyy vaivaa ja päivittäminen helpottuu. DLL:n voi vaikka sisällyttää binaaripakettiin. SDL:n kehitystiedostoja kirjaston käyttäjät eivät tarvitse sen enempää kuin muissakaan SDL-ohjelmissa, kun SDL on linkitetty jo oman kirjastosi DLL:ään. OpenGL viihtyy itsekseen, tuskin siitä staattista versiota on mielekkäästi mahdollista tehdäkään.

Tiivistelmä: Voit tehdä kirjastostasi dynaamisen tai staattisen. Dynaaminen vaatii mukaan DLL:n, pienentää pääohjelmaa ja helpottaa kirjaston päivittämistä ohjelmasta riippumattomasti. Molemmissa tapauksissa voit linkittää SDL:n edelleen dynaamisesti tai staattisesti, kirjastosi käyttäjät eivät tarvitse tästä muuta kuin dynaamisessa tapauksessa SDL.dll:n. Muita otsikoita kuin omasi ei tarvitse laittaa mukaan missään tapauksessa (paitsi tietenkin jos rajapintasi vaatii niistä määrittelyjä muutenkin kuin sisäisesti). Suosittelen molemmissa kohdissa dynaamista vaihtoehtoa, ellet keksi hyvää syytä tehdä toisin.

Mazzimo [15.05.2008 01:53:03]

#

Eli selvennän vielä tuota Metabolix:n hienosti selitettyä linkitysjuttua:

- Kun teet oman dll:n ("Oma.dll"), niin linkitä SDL.lib tämän Oma.dll:n projektiin mukaan (VS:ssä esim. #pragma comment(lib, "SDL.lib"))
- Kun käyttäjä haluaa käyttää oma.dll:ää, hänen täytyy linkittää se mukaan (#pragma comment(lib, "Oma.lib")). Tällöin hänellä pitää olla seuraavat tiedostot, jotta ohjelma toimii ja käännös onnistuu:
1) Oma.dll
2) Oma.lib
3) SDL.dll
4) Oma.dll:n headerit (.h)

Kaikki nuo voivat olla esim. yhdessä RAR-paketissa, joten erinäisiä latauksia ei tarvita. :)

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta