1. ホーム
  2. c

[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照

2022-01-22 21:18:33

質問

makefileがエラーなく動作するようになるには、問題があります。最初の問題は、mainへの未定義参照です。私は、producer.c ファイルに関数として main を持っています。2つ目の問題は、SearchCustomer()への未定義の参照です。

のエラーが発生しました。

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

解決方法は?

このルール

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

は間違いです。producer.oというファイルを作れと書いてあります( -o producer.o という名前のファイルを作りたいのでしょう。 main . 大声はご容赦ください。 ターゲットを参照するには、常に$@を使用します。 :

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

Shahbazが正しく指摘するように、gmakeのプロもまた $^ これは、ルール内のすべての前提条件に展開されます。一般的に、文字列や名前を繰り返すようなことがあれば、それは間違っているので、内蔵されているものであれ、自分で作ったものであれ、変数を使用すべきです。

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