Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Staattisten kirjastojen käyttö PureBasicissa

Sivun loppuun

Pilari [03.12.2008 15:03:58]

#

Miten PureBasicissa voi käyttää Visual C++:lla tehtyjä staattisia kirjastoja?

Import "Kirjasto.lib"
  Testi()
EndImport

Ilmoittaa vain että funktiota _testi ei löydy.

Metabolix [03.12.2008 16:13:00]

#

En PureBasicia tunne, mutta tässä täytynee nyt huomioida C++:n hassu tapa muokata funktion nimeä sen mukaan, mitä parametreja se ottaa ja mitä palauttaa. Esimerkiksi int testi() on lopulta _Z5testiv, kun taas int testi(int) onkin _Z5testii. Ongelmasta pääsee eroon kirjoittamalla extern-rivin näin:

extern "C" int testi(int a);

Asiaa sivutaan tavallaan tässä koodivinkissä.

Pilari [03.12.2008 16:51:17]

#

Nyt funktio löytyy (kai), mutta ilmoittaa uuden virheen: Invalid or corrupt object 'stdafx.obj'.

EDIT: Kun lisäsin koodia funktion sisälle, tuli uusi virhe: Corrupt library "testi.lib"; unable to find symbol '_Testi' in member '.\Release\stdafx.obj'.

ville-v [03.12.2008 17:16:35]

#

PureBasic näköjään odottaa funktiosi nimen alkavan alaviivalla. Se siis pitäisi lisätä jonnekin.

Metabolix [03.12.2008 17:28:47]

#

En muista VC++:n sielunelämän yksityiskohtia, mutta hämärästi muistelisin, että stdafx on jokin VC++:n hienous, josta ei ainakaan minulle koskaan ollut kuin haittaa ja joka piti vaivalla tuhota ja teurastaa jokaisesta omasta projektista, jotta kaikki toimisi kunnolla. Jossain projektin asetusten syövereissä on valintalaatikko, josta sen voi ottaa pois käytöstä. (Mielessä kummittelee teksti "Use precompiled headers", mutta se voi olla jokin muu murheellinen tapaus.)

Testaa joka tapauksessa ensin, että saat kirjaston toimimaan toisen C++-projektin kanssa yhteen.

ville-v kirjoitti:

PureBasic näköjään odottaa funktiosi nimen alkavan alaviivalla. Se siis pitäisi lisätä jonnekin.

Useimmat kääntäjät lisäävät sen ihan omia aikojaan. (Mistä muusta syystä PureBasic sellaista kaipaisi?) Tälle lienee jokin historiallinen peruste.

Pilari [03.12.2008 18:13:44]

#

Oho: ei toiminut toisessa C++-projektissa.
En näköjään osaa tehdä staattisia kirjastoja, voisiko joku antaa esimerkin?

Metabolix [03.12.2008 18:26:27]

#

Kirjastot ja niiden tekeminen ovat aivan kääntäjäkohtaisia asioita, ja eri kääntäjien kirjastotiedostot eivät ole keskenään yhteensopivia. Koodissa sinänsä ei tarvitse olla mitään ihmeellistä, eli jos koodi toimii sillä, että kirjastoon laitettava koodi on toisessa tiedostossa ja pääohjelma toisessa (kuten linkittämässäni koodivinkissä), täsmälleen sama koodi toimii myös staattisena kirjastona. VC++ luultavasti sisältää oman projektityyppinsä kirjastoja varten. GCC:llä prosessi onnistuu komentorivillä esimerkiksi näin:

gcc kirjasto.c -c -o kirjasto.o
ar -rcs libkirjasto.a kirjasto.o

gcc ohjelma.c -L. -lkirjasto

Testikirjastoksi kelpaa vaikkapa

extern "C" int kerro(int a, int b) { return a * b; }

ja testiohjelmaksi

#include <stdio.h>
extern "C" int kerro(int a, int b);
int main() { printf("2 * 3 = %d\n", kerro(2, 3)); }

Neuvoisin, että yrität luoda kirjaston VC++:n kirjastoprojektina ja poistat aluksi projektista (ja sen asetuksista) kaiken ylimääräisen niin, että saat aikaan mahdollisimman tyhjän kirjastotiedoston (koko luultavasti enintään kilotavun luokkaa). Näin päästään yleensä turvalliselle maaperälle ja jopa Microsoftin ohjelmat toimivat täst'edes suunnilleen odotusten mukaan. ;)

Joudun tässä luonnollisesti vain arvailmaan, kun ei ole Windowsia eikä PureBasicia.

Pilari [04.12.2008 07:58:28]

#

PureBasicissa ei näköjään toimi Visual C++:lla tehdyt staattiset kirjastot.
Käänsin staattisen kirjaston GCC:llä ja nyt toimii. Kiitoksia.


Sivun alkuun

Vastaus

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

Tietoa sivustosta