Pertanyaan (.text + 0x20): referensi tidak terdefinisi ke referensi `utama 'dan tidak terdefinisi ke fungsi


Saya mengalami masalah membuat makefile saya bekerja tanpa kesalahan. Masalah pertama yang saya miliki adalah referensi yang tidak terdefinisi ke utama. Saya memiliki utama di file producer.c saya sebagai fungsi. Masalah kedua adalah referensi tidak terdefinisi ke SearchCustomer ().

kesalahan:

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

8
2017-12-11 08:53


asal


Jawaban:


Aturan ini

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

salah. Ia mengatakan untuk membuat file bernama producer.o, tetapi Anda ingin membuat file bernama main. Maafkan teriakan itu, tapi SELALU GUNAKAN $ @ UNTUK MENCERMINKAN TARGET:

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

12
2017-12-11 08:57



Kesalahan ini berarti bahwa, saat menautkan, compiler tidak dapat menemukan definisi main() berfungsi di mana saja.

Di makefile Anda, itu main aturan akan diperluas ke sesuatu seperti ini.

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

Sesuai dengan gcc  halaman manual, penggunaan -o switch adalah seperti di bawah ini

-Hai mengajukan  Tempatkan output dalam file mengajukan. Ini berlaku terlepas dari jenis output apa pun yang sedang diproduksi, apakah itu dapat dieksekusi   file, file objek, file assembler atau kode C preprocessed. Jika -o   tidak ditentukan, defaultnya adalah untuk meletakkan file yang dapat dieksekusi a.out.

Artinya, gcc akan meletakkan output dalam nama file yang disediakan di sebelah -o beralih. Jadi, di sini bukannya menghubungkan semua .o file bersama dan membuat biner [main, dalam kasus Anda], yang menciptakan biner sebagai producer.o, menghubungkan yang lain .o file. Harap perbaiki itu.


4
2017-12-11 09:06