(.text+0x20): ongedefinieerde verwijzing naar `main’ en ongedefinieerde verwijzing naar functie

Ik heb een probleem om mijn makefile foutloos te laten werken. Het eerste probleem dat ik heb is met een ongedefinieerde verwijzing naar main. Ik heb main in mijn producer.c-bestand als functie. Het tweede probleem is een ongedefinieerde verwijzing naar SearchCustomer().

fout:

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

Antwoord 1, autoriteit 100%

Deze regel

main: producer.o consumer.o AddRemove.o
   $(COMPILER) -pthread $(CCFLAGS) -o producer.o consumer.o AddRemove.o

is fout. Er staat dat je een bestand moet maken met de naam producer.o (met -o producer.o), maar je wilt een bestand maken met de naam main. Excuseer het geschreeuw, maar GEBRUIK ALTIJD $@ OM HET DOEL TE REFERENTIE:

main: producer.o consumer.o AddRemove.o
   $(COMPILER) -pthread $(CCFLAGS) -o $@ producer.o consumer.o AddRemove.o

Zoals Shahbaz terecht opmerkt, zouden de gmake-professionals ook $^ gebruiken, wat zich uitbreidt tot alle vereisten in de regel. Als u merkt dat u een tekenreeks of naam herhaalt, doet u het in het algemeen verkeerd en moet u een variabele gebruiken, of dit nu een van de ingebouwde functies is of een die u zelf maakt.

main: producer.o consumer.o AddRemove.o
   $(COMPILER) -pthread $(CCFLAGS) -o $@ $^

Antwoord 2, autoriteit 39%

Deze fout betekent dat de compiler tijdens het koppelen de definitie van de functie main() nergens kan vinden.

In je makefile wordt de main regel uitgebreid tot zoiets als dit.

main: producer.o consumer.o AddRemove.o
   gcc -pthread -Wall -o producer.o consumer.o AddRemove.o

Volgens de gcc handmatige pagina, is de gebruik van -o schakelaar is zoals hieronder

-o bestand     Plaats uitvoer in bestand bestand. Dit is van toepassing ongeacht het soort output dat wordt geproduceerd, of het nu een uitvoerbaar bestand is
bestand, een objectbestand, een assemblerbestand of voorbewerkte C-code. Als -o
niet is opgegeven, is de standaardinstelling om een ​​uitvoerbaar bestand in a.out te plaatsen.

Het betekent dat gcc de uitvoer in de opgegeven bestandsnaam direct naast de schakelaar -o plaatst. Dus, in plaats van alle .o-bestanden aan elkaar te koppelen en het binaire bestand [main, in jouw geval] te maken, wordt het binaire bestand gemaakt als producer.o, die de andere .o-bestanden koppelt. Corrigeer dat alstublieft.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

17 − 5 =

Other episodes