|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
[Urgente] Opzione gcc
Salve a tutti,
nella documentazione del gcc non riesco a trovare l'opzione per scegliere la directory in cui collocare il file risultante dalla compilazione, lo so che si puo usare l'opzione -o gcc -c file.c -o ./bla/bla/bla/file.o pero io devo compilare insieme più file, quindi non posso usare l'opzione -o, siccome il comando di trova in un makefile, non conosco a priori quali sono i file che compilo, i loro nomi si trovano in una varibile, diciamo FILES: FILES = aaa.c bbb.c fff.c TARGET : $(FILES) ...............gcc -c $(FILES) per ora ho fatto cosi, pero in questo modo mi colloca i file .o prodotti nella directory corrente, mentre io li vorrei in un'altra directory, diciamo DIR = ./../MiaDir come faccio? Grazie e ciao.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Boh non sono un guru dei Makefile, ma un modo (non molto corretto) è il seguente:
Codice:
# Gli object ricavati dai file .c OBJS := a.o b.o # Directory dove mettere gli object BDIR := build # il nome dell'eseguibile TGT := test # Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS) CFLAGS := -O2 all: ${TGT} ${TGT}: objs=""; \ for obj in ${OBJS}; do \ fc=`echo $$obj | sed s/\.o/\.c/`; \ ${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \ objs=$$objs\ ${BDIR}/$$obj; \ done; \ ${CC} -o $@ $$objs ${LDFLAGS} || exit 1;
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
grazie
![]() anche se avrei preferito che il gcc metteesse a disposizione già da sè l'opzione di cui avevo bisogno, visto che offre centinaia di opzioni.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
![]() |
![]() |
![]() |
#4 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Come faccio a creare la directory se non esiste?
Ho provato così: Codice:
# Gli object ricavati dai file .c OBJS := main.o ast.o endianess.o jvm.o parser.o scanner.o symtab.o # Directory dove mettere gli object BDIR := ObjDir # il nome dell'eseguibile TGT := Contest1464 # Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS) CFLAGS := -m64 -O2 CC = gcc all: ${TGT} ${TGT}: mkdir %{BDIR} \ objs=""; \ for obj in ${OBJS}; do \ fc=`echo $$obj | sed s/\.o/\.c/`; \ ${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \ objs=$$objs\ ${BDIR}/$$obj; \ done; \ ${CC} -o $@ $$objs ${LDFLAGS} || exit 1; E naturalmente viene generato il messaggio d'errore: Codice:
Assembler messages: Fatal error: can't create ObjDir/main.o: File o directory non esistente make: *** [Contest1464] Errore 1 |
![]() |
![]() |
![]() |
#5 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Risolto:
![]() ![]() ![]() ![]() Avevo digitato % al posto di $ ![]() E ho modificato Makefile così: Codice:
# Gli object ricavati dai file .c OBJS := main.o ast.o endianess.o jvm.o parser.o scanner.o symtab.o # Directory dove mettere gli object BDIR := ObjDir # il nome dell'eseguibile TGT := Contest1464 # Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS) CFLAGS := -m64 -O2 CC = gcc all: createobjdir ${TGT} ${TGT}: objs=""; \ for obj in ${OBJS}; do \ fc=`echo $$obj | sed s/\.o/\.c/`; \ ${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \ objs=$$objs\ ${BDIR}/$$obj; \ done; \ ${CC} -o $@ $$objs ${LDFLAGS} || exit 1; createobjdir: -mkdir ${BDIR} |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Adesso però ho il problema di ignorare il comando mkdir se la directory già esiste:
Codice:
mkdir ObjDir mkdir: impossibile creare la directory "ObjDir": File già esistente make: [createobjdir] Errore 1 (ignorato) ![]() EDIT: Risolto: Codice:
# Gli object ricavati dai file .c OBJS := main.o ast.o endianess.o jvm.o parser.o scanner.o symtab.o # Directory dove mettere gli object BDIR := ObjDir # il nome dell'eseguibile TGT := Contest1464 # Flags ecc. (puoi settare anche CC, CPPFLAGS, LDFLAGS) CFLAGS := -m64 -O2 CC = gcc all: createobjdir ${TGT} ${TGT}: objs=""; \ for obj in ${OBJS}; do \ fc=`echo $$obj | sed s/\.o/\.c/`; \ ${CC} ${CPPFLAGS} ${CFLAGS} -c -o ${BDIR}/$$obj $$fc || exit 1; \ objs=$$objs\ ${BDIR}/$$obj; \ done; \ ${CC} -o $@ $$objs ${LDFLAGS} || exit 1; createobjdir: -mkdir -p -v ${BDIR} Ultima modifica di Vincenzo1968 : 08-01-2013 alle 13:09. |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Certo che è una forza 'sta shell programmabile di Linux.
![]() E anche il comando make è una potenza. Si possono automatizzare molti task. Non serve soltanto per creare gli eseguibili a partire dai sorgenti C. Sempre più felice di avere scoperto Linux. ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:55.