Üdv!
Az egyik ismerősöm Fortranban programoz és van egy kis problémája.
Ha így fordítja a programot:
f77 -O -c ~/Documents/user/foo/bar/a00aaft.f akkor megkapja rendesen az a00aaft.o fájlt.
Viszont, ha csak ennyit "f77 -O -c ../bar/a00aaft.f" ír be akkor egy '.o' fájlt kap név nélkül. A fordítás terminálban zajlik Ubuntu alatt. Szerinte valami gond lehet a környezeti változókkal.
uname -a:
Linux maph 3.0.0-13-generic #22-Ubuntu SMP Wed Nov 2 13:27:26 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux
A cél az lenne, hogy ha nem abszolút elérési út van akkor is rendesen adjon nevet a programnak a fordító. Azt tudjuk, hogy a -o-val lehet névvel felparaméterezni a fordítót, de mi neki csak annyi kell, hogy a valami.f legyen a neve.
- 6334 megtekintés
Hozzászólások
NAG library?
Egyébként nálam is ugyanezt csinálja (debian testing). Okát nem tudom egyelőre.
- A hozzászóláshoz be kell jelentkezni
Az f77 nálam egy perl szkript. Belenézve szerintem az van, hogy az object fájl nevét a forrásfájlból állítja elő és a (.f) -> (.c) -> (.o) sorban a kiterjesztés meghatározásában a pontok fontos szerepet játszanak, így a "../" bezavarhat. De lehet, hogy nem így van, ha valaki jobban otthon van a reguláris kifejezésekben, akkor íme:
$lfile = ($basefile =~ /([^\/\.]*\.).*$/)[0] . "o";
$lfile tartalmazza az object fájlt, $basefile a forrás.
- A hozzászóláshoz be kell jelentkezni
Ott a pont. Az első pont utáni részt cseréli le, miközben az utolsó pont utánit kéne...
- A hozzászóláshoz be kell jelentkezni
Köszi a gyors választ, valóban ez a gond!
Sajnos én nem vagyok egy perl mester, de egy lehetséges megoldás:
use File::Basename;
$lfile = fileparse($basefile,'\..*') . ".o";
Ehhez viszont be kell húzni, a File:Basename osztályt, vagy mit (nem tudom mi van perl-ben... :) ). Lehet kicsit overkill, szóval ha valaki tud egy egysoros regexp-es megoldást, az ne habozzon. Mondjuk ez azért jó mert a perl saját kódja és biztos működik minden esetben, minden oprendszer alatt.
Amúgy a beépített parser alapján:
$lfile = ($basefile =~ s!^.*/([^/]*)$!\1!);
Ezzel annyi a baj, hogy a fájl nevet kiterjesztéssel adja vissza és hogy az eredményt nem az $lfile-ba pakolja, hanem kicseréli a $basefile értékét. Gondolom ez az s operátor miatt van. De nem tudtam átírni, úgy, hogy csak a fájl nevét adja vissza kiterjesztés nélkül és az értéket az $lfile-ba írja, mert ha az s-t kitörlöm az elejéről syntax error-t kapok.
Nem foglalkoztam a dologgal sokat, csak keresni akartam egy működő megoldást.
- A hozzászóláshoz be kell jelentkezni
Hol vannak ilyenkor a perl mesterek? :)
Valaki beírhatna valami szép egyszerű megoldást...
- A hozzászóláshoz be kell jelentkezni
$lfile=$basefile;
$lfile=~s/\.[^.]*$/\.o/;
- A hozzászóláshoz be kell jelentkezni
- A hozzászóláshoz be kell jelentkezni
Miért nem jó?
- A hozzászóláshoz be kell jelentkezni
Most, hogy rákérdeztél már nem vagyok benne biztos, de az $lfile értéke nem csak a fájl neve lehet? Az nem baj, hogy ott van az elérési út is?
- A hozzászóláshoz be kell jelentkezni
Az object fájl neve eddig is "beállítódott" (.o), és létre is jött, de mivel rejtett fájl lett és a neve egyáltalán nem emlékeztetett a forrásfájl nevére, ezért ez nem tetszett...
- A hozzászóláshoz be kell jelentkezni
Igen, nekem is ez volt a problémám, ezért nyitottam a topicot. Eddig az lfile értéke ".o" volt, a cél az lenne, hogy a fájl neve "a00aaft.o" legyen. A zeller megoldásával viszont az lfile értéke "../bar/a00aaft.o" lesz. Mivel nem használok Fortrant, ezért nem tudom, hogy a fájlnévben benne lehet-e az elérési út is vagy nem. Erre irányult a kérdésem.
- A hozzászóláshoz be kell jelentkezni
Lehet cifrázni, hogy az elejétől az utolsó perjelig (nem, nem a szerzetesi elöljáró) el legyen dobva minden, viszont ebben az esetben az aktuális könyvtárba kerül az object fájl, nem pedig a forrásfájl mellé.
A gcc egyébként a gcc -c ../foo/bar/baz.c esetén az aktuális könyvtárba rakja a baz.o fájlt, úgyhogy tényleg illene lecsapni az útvonalat is.
- A hozzászóláshoz be kell jelentkezni
Fordítás menete:
1. preprocesszor
2. object
3. linkelés
A fordítást make-kel kell automatizálni, btw miért kell .. miért nem lehet a ..-ból fordítani? Intel fordító?
- A hozzászóláshoz be kell jelentkezni