Ho problemi a far funzionare il makefile senza errori. Il primo problema che ho è con un riferimento non definito a main. Ho una parte principale nel mio file producer.c come una funzione. Il secondo problema è un riferimento non definito a SearchCustomer().(.text + 0x20): riferimento non definito a "main" e riferimento non definito alla funzione
errore:
bash-4.1$ make
gcc -Wall -c producer.c shared.h
gcc -Wall -c consumer.c shared.h
gcc -Wall -c AddRemove.c shared.h
gcc -pthread -Wall -o producer.o consumer.o AddRemove.o
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
AddRemove.o: In function `AddRemove':
AddRemove.c:(.text+0xb1): undefined reference to `SearchCustomer'
AddRemove.c:(.text+0x1e9): undefined reference to `SearchCustomer'
AddRemove.c:(.text+0x351): undefined reference to `SearchCustomer'
collect2: ld returned 1 exit status
make: *** [producer] Error 1
makefile:
COMPILER = gcc
CCFLAGS = -Wall
all: main
debug:
make DEBUG=TRUE
main: producer.o consumer.o AddRemove.o
$(COMPILER) -pthread $(CCFLAGS) -o producer.o consumer.o AddRemove.o
producer.o: producer.c shared.h
$(COMPILER) $(CCFLAGS) -c producer.c shared.h
consumer.o: consumer.c shared.h
$(COMPILER) $(CCFLAGS) -c consumer.c shared.h
AddRemove.o: AddRemove.c shared.h
$(COMPILER) $(CCFLAGS) -c AddRemove.c shared.h
ifeq ($(DEBUG), TRUE)
CCFLAGS += -g
endif
clean:
rm -f *.o
Il codice è ** troppo lungo. Restringi il tuo problema e fornisci [Breve, Autonomo, Corretto (Compilabile), Esempio] (http://sscce.org/). –
Un paio di suggerimenti: nella ricetta 'main', puoi scrivere:' $ (COMPILER) -o $ @ $^$ (LDFLAGS) 'e inserisci' -pthread' in 'LDFLAGS'. Nelle altre regole puoi scrivere ** una volta **: '% .o:% .c' e come ricetta:' $ (COMPILER) $ (CCFLAGS) -c -o $ @ $ <'(e ** non * * dai '.h' al compilatore!) e successivamente aggiungi la dipendenza per target speciali, ad esempio:' producer.o: shared.h other_header.h' e 'consumer.o: shared.h yet_another_header.h' ecc. – Shahbaz
Un paio di altri suggerimenti: Usa '$ (MAKE)' invece di solo 'make' per mantenere i flag della riga di comando per il make invocato. Si potrebbe anche voler dare '--no-print-directory' per evitare coppie di righe di output inutili. Inoltre, usa 'CFLAGS' per C (invece di' CCFLAGS' che potrebbe essere scambiato per C++). – Shahbaz