Makefile [risolto]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Makefile [risolto]

Messaggio da Dani »

Sto cercando di capire come funziona il make ma non ne vengo fuori...
Ad esempio ho tre file .c, contenente il main e i corpi delle funzioni, ed un solo header file, contenente i prototipi di tutte le funzioni e qualcos'altro.
Dal main, in file1.c, chiamo una funzione, presente il file2.c. Da quest'ultima funzione ne chiamo un'altra in file3.c...
Dopo aver dato make pero' ottengo i classici errori "undefined reference to..."
Nel makefile scrivo qualcosa tipo:

Codice: Seleziona tutto

programma : file1.o file2.o file3.o
          cc -o programma file1.o file2.o file3.o

file1.o  : file1.c header.h
          cc file1.c -o file1.o
file2.o  : file2.c header.h
          cc file2.c -o file2.o
file3.o   : file3.c header.h
          cc file3.c -o file3.o
Dov'è che sbaglio :?:
Ultima modifica di Dani il dom 13 gen 2008, 14:06, modificato 1 volta in totale.

Avatar utente
puzuma
Linux 2.x
Linux 2.x
Messaggi: 482
Iscritto il: mar 4 lug 2006, 17:14
Nome Cognome: Stefano Salvador
Slackware: current
Kernel: 2.6.32.2
Desktop: KDE 4.4.0
Località: Udine
Contatta:

Re: Makefile

Messaggio da puzuma »

make guida solo l'ordine con cui esegui i vari comandi non ne sa niente delle dipendenze c (infatti può essere usato per qualsiasi compito non solo la compilazione).

quindi se hai messo tutte le dichiarazioni di funzioni in header.h devi includere questo header nei vari file[1,2,3].c e scrivere il make così:

Codice: Seleziona tutto

programma : file1.o file2.o file3.o
          cc -o programma file1.o file2.o file3.o

file1.o  : 
          cc file1.c -o file1.o
file2.o  : 
          cc file2.c -o file2.o
file3.o   : 
          cc file3.c -o file3.o
se ottieni un errore non è make che sbaglia ma il compilatore, quindi guarda nell'output di make chi sta sbagliando ed esegui il comando a mano, sistema l'errore e poi riprova a far girare make
The quiet ones are the ones who change the world. The loud ones only take the credit.

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: Makefile

Messaggio da Dani »

puzuma ha scritto: quindi se hai messo tutte le dichiarazioni di funzioni in header.h devi includere questo header nei vari file[1,2,3].c e scrivere il make così:
E' quello che ho fatto, ma make continua a dire "undefined reference to ..."
Invece se provo a compilare così:

Codice: Seleziona tutto

gcc -o programma file1.c file2.c file3.c
tutto fila liscio !

Avatar utente
gallows
Staff
Staff
Messaggi: 3470
Iscritto il: lun 20 set 2004, 0:00
Slackware: 64-current
Kernel: 5.10.7
Località: ~/
Contatta:

Re: Makefile

Messaggio da gallows »

Codice: Seleziona tutto

file1.o  : file1.c header.h
          cc file1.c -o file1.o
Fai partire il linker così, devi usare la flag "-c".

Dani
Linux 4.x
Linux 4.x
Messaggi: 1447
Iscritto il: mer 26 apr 2006, 1:52
Desktop: gnome
Distribuzione: arch

Re: Makefile [risolto]

Messaggio da Dani »

Ok aggiungendo il flag -c compila, grazie.
Già che ci sono colgo l'occasione per chiedere un parere sul metodo di scrittura del codice...Come ho scritto prima capita nel sorgente di rimbalzare da un file all'altro; ad esempio la funzione x nel primo file chiama la funzione y del secondo. Questa a sua volta chiama altre funzioni, magari in altri files...E' una cattiva pratica di programmazione la mia ?

Rispondi