24.1. 2000 Numerical Recipes kirjaston tekeminen GnuC:ssa: OHJE 5 ------------------------------------------------------- Kurssin NRC00 kotisivu on www.math.helsinki.fi/~arasila/nrkurssi/ Sieltä löytyy kurssimateriaalia ja erilaisia demoja sekä ohjeita. Numerical Recipes-ohjelmiston nykyinen versio on 2.08. Tarvitset kirjaston luomiseksi c_ansi.tar nimisen tiedoston. Purkaminen komennolla 'tar -xvf c_ansi.tar'. 1) Kirjaston teko ilman Makefile:ä: Voit tehdä nr-rutiineista kirjaston GnuC:llä (Unix/Linux) seuraavasti: a. Kopioi kaikki rutiinit (myos *.h) samaan hakemistoon. b. Käännä ne esim. komennolla gcc -O -c *.c Jos tulee vaikeuksia, lue allaoleva kohta 4) tiedoston nr.h muokkaamisesta. c. Talleta objektitiedostot kirjastoon komennolla ar rcv libnr.a *.o d. aja ranlib-ohjelma, joka lisää kirjastoon sisällysluettelon ranlib libnr.a (ranlib ei ole välttämätön kaikissa os:ssa) 2) Kirjaston teko Makefilella (suositeltavin tapa): Makefile-kieli on perustaltaan laajennettua shell-script:iä. Näin ollen valmiissa Makefile:ssä annettujen muuttujien arvot ole yleensä valmiiksi yhteensopivat oman koneesi konfiguraation kanssa. Muutokset ovat yleensä pieniä (mutta sitäkin tarpeellisempia). Jos käytät valmista Makefile:ä (löytyy hakemistosta recipes_c-ansi/) niin tarkista ovatko kaikilla maken tarvitsemilla ohjelmilla (esim. ar, test ja make) oikeat systeemipolut. Siis esimerkiksi 'MAKE = /usr/bin/make' voi olla koneellasi muuallakin. Voit tarkistaa ohjelmien hakupoluja komennolla 'which'. Esim. 'which make' antaa tuloksen (omassa koneessani) '/usr/bin/make'. Muutujalle 'LIBDIR' kannattaa antaa myös uusi järkevä polku. Esim. 'LIBDIR = /home/oma_tunnari/nrc/lib'. Hakemisto pitää luoda etukäteen. Myös 'CANSILIB = librecipes_c.a' kannattaa muuttaa muotoon 'CANSILIB = libnr.a'. Tämän jälkeen riittää antaa komento 'make all'. Jos make ilmoittaa virheistä, niistä yleensä selviää aika pienellä debuggaamisella. Onnistuneesta suorituksesta voit olla melko varma jos make ei antanut virheitä ja libnr.a on ilmestynyt valitsemaasi hakemistoon. 3) Kirjaston käyttö Kirjastotiedostoa libnr.a voi kayttää komentorivillä sellaisenaan esim. tyyliin gcc oma.c libnr.a -o oma -lm edellyttäen, että kaikki *.h tiedostot ovat oletushakemistossa, myös oma.c ja libnr.a. Fiksumpaa on laittaa kirjasto- ja otsikko- tiedostot johonkin sopiviin hakemistoihin, tällä kurssilla sellaisia ovat nrc00/lib (kirjastolle) ja nrc00/util (otsikkotiedostoille). Kirjasto- ja include-tiedostojen sijainnit voi kertoa kääntäjälle -L ja -I optiolla esim. seuraavan tyyliin gcc oma.c -L../lib/ -I../util -o oma -lm -lnr Huomaa kuinka libnr.a on lyhentynyt tunnukseksi nr. Sama tunnuksen lyhentyminen koskee myös systeemikirjastotiedostojen käyttöä (jotka sijaitsevat kääntäjän edellyttämässä paikassa). Jos tiedosto libnr.a on hakemistossa /usr/lib, niin polkua ei tarvitse antaa optiolla -L, riittää -lnr. 4) Select-ongelma Nr-funktioissa on käytetty samannimistä funktiota, select, kuin systeemikirjastossa libm.a. Konfliktin voi välttää kommentoimalla 'nr.h' tiedostosta select-funktion prototyypin (ts. esittelyrivin). 5) Esimerkkiohjelmat Kaikkiin ohjelmiin liittyy myös niitä kutsuva esimerkkiohjelma, joiden nimet ovat x-alkuisia. Ne löytyvät komennolla: find recipes_c-ansi -name xsvdcmp.c Kaikki sellaiset ohjelmat, jotka kutsuvat ohjelmaa svdcmp saadaan selville käskyllä: find recipes_c-ansi -name '*.c' -exec grep svdcmp {} \; -print Huomaa, että osa esimerkkiohjelmista edellyttää datatiedostojen käyttöä. Ne löytyvät komennolla: find recipes_c-ansi -name *.dat Datatiedostoja käyttävä esimerkkiohjelma kannattaa kopioida työskentelyhakemistoon. Näiden valmistelujen jälkeen voi kokeilla esim. käskyä gcc xludcmp.c -o a -L../lib -I../util -lm -lnr jonka pitaisi tuottaa ajokelpoinen ohjelma a. Se ajetaan komennolla ./a. HUOM! Kohdan 1) mukaisesti kirjaston teko onnistuu pienin muutoksin myös muissa ympäristöissä. Joitakin vuosia sitten käytimme TurboC:lla tehtyä kirjastoa DOS:ssa. Ks. ohje1.tex ja ohje2.tex hakemistossa http://www.math.helsinki.fi/~arasila/nrkurssi/nrc00/ Koneessa IRIX 6.1 IP21 Silicon Graphics kirjaston teko GnuC-kääntäjällä voi tuottaa vaikeuksia. Kirjaston voi tehdä kuitenkin cc-kääntäjällä. Kohdassa 1)b käytetään silloin komentoa cc -c *.c Kohtaa 1d) ei tarvita. Kohdat 1a) ja 1c) ovat ennallaan. Kirjastotiedostoa käytetään kuten yllä paitsi, että komento gcc korvataan komennolla cc. Joissakin NRC-kirjaston ohjelmissa on määriteltynä funktio main(). Tämä saattaa aiheuttaa ongelmia kirjaston linkityksessä. Jos haluat, voit poistaa ongelmalliset ohjelmat ennen kirjaston kääntämistä (vaihe 1b), ne ovat: badluk.c, fredex.c, rlftfrag.c, sproid.c, sphfpt.c ja sphoot.c. Näissä koodeissa esiintyviä funktiokutsuja ei käytetä tällä kurssilla. -------------------------------------------------------