Miten PureBasicissa voi käyttää Visual C++:lla tehtyjä staattisia kirjastoja?
Import "Kirjasto.lib" Testi() EndImport
Ilmoittaa vain että funktiota _testi ei löydy.
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ä.
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'.
PureBasic näköjään odottaa funktiosi nimen alkavan alaviivalla. Se siis pitäisi lisätä jonnekin.
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.
Oho: ei toiminut toisessa C++-projektissa.
En näköjään osaa tehdä staattisia kirjastoja, voisiko joku antaa esimerkin?
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.
PureBasicissa ei näköjään toimi Visual C++:lla tehdyt staattiset kirjastot.
Käänsin staattisen kirjaston GCC:llä ja nyt toimii. Kiitoksia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.