|
|||||||
|
|
|
![]() |
|
|
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 14: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: 07:22.




















