Pagina 1 di 1

Makefile

Inviato: mercoledì 4 luglio 2007, 16:20
da ciro_!
1 Cos'è? E' uno script che serve per compilare un programma?

2. Ho un programma di nome prova2.c ho bisogno del makefile, mi aiutate a capire come si crea un makefile?

Ecco il materiale a disposizione:
prova2.c si trova in home/ciro/Desktop/blas/
makefile lo devo creare in questa stessa directory?

Partendo dal seguente Makefile e volendolo modificare
#
# The Makefile
#

# dlvd = path della dir CBLAS
dlvl = home/ciro/Desktop/blas/CBLAS/
include $(dlvl)/Makefile.in

# path degli header file
INC = -I$(CBDIR)/src

# Archivi necessari per compilare
LIB = $(CBLIB) $(BLLIB) –lf2c

prova2: prova.o
            $(CC) -o esex prova.o $(LIB)
clean:
            rm -f core *.o a.out
cleanobj:
            rm -f core *.o a.out
.f.o:
            $(FC) $(FFLAGS) -c $*.f
.c.o:
            $(CC) $(INC) $(CFLAGS) -c $*.c


in questo make file c'e' un richiamo a makefile.in presente nella directory home/ciro/Desktop/blas/CBLAS/

makefile.in:
SHELL = /bin/sh

#-----------------------------------------------------------------------------
# Platform
#-----------------------------------------------------------------------------

PLAT = LINUX

#-----------------------------------------------------------------------------
# Libraries and includs
#-----------------------------------------------------------------------------

BLLIB = $(HOME)/Desktop/blas/CBLAS/lib/libblas.a
CBDIR = $(HOME)/Desktop/blas/CBLAS
CBLIBDIR = $(CBDIR)/lib/$(PLAT)
CBLIB = $(CBLIBDIR)/cblas_$(PLAT).a

#-----------------------------------------------------------------------------
# Compilers
#-----------------------------------------------------------------------------

CC = gcc
FC = g77
LOADER = $(FC)

#-----------------------------------------------------------------------------
# Flags for Compilers
#-----------------------------------------------------------------------------

CFLAGS = -O3 -DADD_
FFLAGS = -O3 

#-----------------------------------------------------------------------------
# Archive programs and flags
#-----------------------------------------------------------------------------

ARCH = ar
ARCHFLAGS = r
RANLIB = echo



Chi mi spiega come si crea il Makefile e quali sono i parametri da modificare e perchè?  (b2b)

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 16:28
da Alepp0
non è che tanto semplice spiegare cos'è un Makefile, eccetto quando si tratta di due istruzioni. :)

Comunque un breve tutorial lo trovi qua: http://mrbook.org/tutorials/make/.

Nel caso indicato da te, penso che non è stato creato solo un Makefile da utilizzare con 'make', ma dietro ci sono anche gli autotools (vd. http://sourceware.org/autobook/)

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 16:34
da ciro_!
ora do un'occhiata ai tutorials pero' forse ho fatto un passo avanti perchè compilando mi da 1 solo errore forse è una sciocchezza.

allora il mio makefile è quello scritto sopra e utilizza anche makefile.in.

quando do il make mi da questo output:
ciro@ciro:~/Desktop/blas$ make
makefile:16: *** missing separator (did you mean TAB instead of 8 spaces?).  Stop.


a cosa potrebbe esser dovuto l'errore?

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 16:40
da Alepp0
Nel primo link che ho indicato c'è scritto:
The basic makefile is composed of:

target: dependencies
[tab] system command
Quindi quell'errore sarà dovuto al fatto che alla riga 16 c'è una linea senza il carattere tabulatore (che è obbligatario e formato da otto spazi).

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 16:42
da ciro_!
si infatti era proprio quello il problema c'era un doppio tab.

ora dando make mi dice:

ciro@ciro:~/Desktop/blas$ make
gcc -o esex prova.o /home/ciro/Desktop/blas/CBLAS/lib/LINUX/cblas_LINUX.a /home/ciro/Desktop/blas/CBLAS/lib/libblas.a –lf2c
gcc: –lf2c: Nessun file o directory
make: *** [prova2.c] Error 1


cos'e' che non trova? prova.o? prova2.c? o le librerie?

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 16:57
da Alepp0
quando trovi un parametro passato a gcc come '-l' si tratta di una libreria. Nel tuo caso il nome completo dovrebbe essere 'libf2c.a' (cioè statica, oppure condivisa e terminerebbe con l'estensione «.so» [1]).
GCC cerca le librerie implicitamente nel path «/usr/lib», o «/lib». Se la libreria si trovo in altro posto, dovrebbe essere passata con il flag 'L' (es. -L/opt/bad/lib -ltest -- ipotizzando un file di libreria chiamato 'libtest.a')

[1] premesso che sul tema delle librerie ci potremmo scrivere un libro :), per quanto riguarda l'inclusione di librerie condivise, non sono capace in poche righe di spiegarti chiaramente come utilizzarle: dovrei parlarti dell'utility 'ld.so', dei file «/etc/ld.so.cache», «/etc/ld.so.conf», del programmino 'ldconfig', della variabile d'ambiente LD_LIBRARY_PATH, dell'opzione '-Wl' (se non erro) del compilatore... ergo, meglio un buon manuale sulla cosa.

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 17:12
da ciro_!
ho capito piu' o meno quello che hai tentato di spiegarmi e quanto prima mi procurero' dei manuali. Diciamo che sono un novellino in quanto non avevo mai visto un sistema unix prima di installare ubuntu pochi giorni fa.

se ho capito bene il problema è: -lf2c infatti se lo ometto il programma mi crea correttamente l'eseguibile.

Dunque la mia domanda è perchè c'e' bisogno di questa ulteriore libreria? -lf2c rappresenta una libreria standard? e se si come posso fare per procurarmela?

p.s. io sto seguedo gli appunti del professore, scritti malissimo tra l'altro ora io ho capito che
gcc -o esex prova.o /home/ciro/Desktop/blas/CBLAS/lib/LINUX/cblas_LINUX.a /home/ciro/Desktop/blas/CBLAS/lib/libblas.a –lf2c

mi crea l'eseguibile esex di prova.o + 3 librerie, le prime 2 con tanto di percorso specifico piu' la terza giusto?
un'altra domanda quando ho esex per eseguirlo da terminale devo dare

Codice: Seleziona tutto

./esex
o esistono altri comandi per eseguirlo?

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 17:27
da Alepp0
ciro_! ha scritto: se ho capito bene il problema è: -lf2c infatti se lo ometto il programma mi crea correttamente l'eseguibile.
sì, il compilatore non la trova e non riesce a creare l'eseguibile.
Dunque la mia domanda è perchè c'e' bisogno di questa ulteriore libreria?
non ne ho la più pallida idea. :) Evidentemente il programma usa funzioni contenute all'interno di esse. Concetto identico nell'usare la funzione 'printf' contenuta in 'stdio.h'. Cioè, non c'è nulla di sbagliato ad includerla se si usano le funzioni in essa contenute.
-lf2c rappresenta una libreria standard? e se si come posso fare per procurarmela?
dubito che è una funzione standard.
p.s. io sto seguedo gli appunti del professore, scritti malissimo tra l'altro
faglielo presente.
gcc -o esex prova.o /home/ciro/Desktop/blas/CBLAS/lib/LINUX/cblas_LINUX.a /home/ciro/Desktop/blas/CBLAS/lib/libblas.a –lf2c
mi crea l'eseguibile esex di prova.o + 3 librerie, le prime 2 con tanto di percorso specifico piu' la terza giusto?
no, ti crea l'eseguibile come da parametro '-o', ma le librerie non le crea, già sono state create.
un'altra domanda quando ho esex per eseguirlo da terminale devo dare

Codice: Seleziona tutto

./esex
o esistono altri comandi per eseguirlo?
qualunque file eseguibile non presente nel $PATH deve essere avviato con quella sintassi. Puoi vedere cosa contiene l'ambiente PATH con 'echo $PATH': ci sono vari modi per modificarlo, e per modificarlo in automatico tramite la shell, ma siccome sei nuovo di linux non vorrei appesantire il discorso.

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 17:47
da ciro_!
Dunque la mia domanda è perchè c'e' bisogno di questa ulteriore libreria?
non ne ho la più pallida idea. :) Evidentemente il programma usa funzioni contenute all'interno di esse. Concetto identico nell'usare la funzione 'printf' contenuta in 'stdio.h'. Cioè, non c'è nulla di sbagliato ad includerla se si usano le funzioni in essa contenute.
Chiarissimo e ovvio tra l'altro  ;D
-lf2c rappresenta una libreria standard? e se si come posso fare per procurarmela?
dubito che è una funzione standard.
pero' io ho il dubbio che sia qualcosa di standard perchè il prof nel makefile le prime 2 librerie (le BLAS) me le fa richiamare col percorso perchè le ho installate ora in una cartella creata da me mentre la libreria -lf2c la richiama in modo diverso. boh o forse a me non è ancora chiaro il concetto, oppure è il professore che sul suo pc la trova cosi e quindi la richiama cosi.
p.s. io sto seguedo gli appunti del professore, scritti malissimo tra l'altro
faglielo presente.
Stamane sono andato a ricevimento, premetto che lui è un matematico e tiene un corso di laboratorio di calcolo alla facoltà di informatica. ora il 99% dei suoi studenti non ha mai visto linux, perchè non abbiamo nessun corso seguito in precedenza dove si faccia linux. Quindi siamo completamente niubbi in materia. lui mette in rete gli appunti su come si installano le librerie blas... Ora dico io, installando su una piattaforma nuova è normale che uno studente possa incontrare problemi... sono andato a chiedere come si faceva il makefile e mi ha risposto sei tu l'informatico io posso spiegarti la matematica ma non come si installa una libreria su linux...
e quindi? io il progetto non lo faccio? o devo andare da un altro professore con il quale non seguo corsi e farmi spiegare una cosa...che lui si che non è tenuto a spiegarti.
me ne sono tornato a mani vuote che rabbia.
Dunque ti ringrazio davvero di cuore per queste informazioni che mi hai dato

Un ultima domanda, siccome devo scrivere programmi in c, che utilizzino queste librerie aggiuntive a quelle standard che programmi posso usare?

la mia attuale procedura, un po' rozza credo è:
- scrivere il programma in c in un file di testo
- aprire il terminale e fare la compilazione

esiste un programma che si installi su ubuntu con interfaccia? un compilatore c o qualcosa di simile? io ho installato build essential ma credo serva solo per aggiungere il g++ e simili da usare via terminale o mi sbaglio?

Re: Makefile

Inviato: mercoledì 4 luglio 2007, 21:30
da Alepp0
ciro_! ha scritto: pero' io ho il dubbio che sia qualcosa di standard perchè il prof nel makefile le prime 2 librerie (le BLAS) me le fa richiamare col percorso perchè le ho installate ora in una cartella creata da me mentre la libreria -lf2c la richiama in modo diverso. boh o forse a me non è ancora chiaro il concetto, oppure è il professore che sul suo pc la trova cosi e quindi la richiama cosi.
Non complicarti la vita: chiedi a lui. I professori sono pagati per insegnare non per confondere, o per far applicare erroneamente il rimedio sbagliato (cit. prof. di fisica).
Un ultima domanda, siccome devo scrivere programmi in c, che utilizzino queste librerie aggiuntive a quelle standard che programmi posso usare?

la mia attuale procedura, un po' rozza credo è:
- scrivere il programma in c in un file di testo
- aprire il terminale e fare la compilazione
che, IMHO, è la soluzione ottimale. :)
esiste un programma che si installi su ubuntu con interfaccia? un compilatore c o qualcosa di simile? io ho installato build essential ma credo serva solo per aggiungere il g++ e simili da usare via terminale o mi sbaglio?
penso che non ti serve un IDE (te questo cerchi a quanto ho capito): scriverai codice in C, farai link a librerie che puoi tranquillamente fare da linea di comando, magari con un semplice Makefile (per evitare di scrivere un comando 'gcc ...' da 200 caratteri :))

Se proprio vuoi un ambiente IDE prova Eclipse o qualcosa del genere (vedi post passati, ne hanno indicato diversi).