[解決済み] (.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 $@ $^
関連
-
[解決済み】Valgrind が "Invalid write of size 8" で文句を言う。
-
[解決済み】ポインタと整数の比較で警告が出る
-
[解決済み】ポインタへの代入時に互換性のないポインタ型からの初期化警告が発生した
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み] [Solved] なぜこのようなエラーが発生するのでしょうか。「データ定義に型またはストレージクラスがない」?
-
[解決済み】コンパイラの警告 - 真理値として使用される代入の周囲に括弧を付けることを推奨する
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】ISO C90では、C言語での宣言とコードの混在が禁止されています。
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】サイズ8の無効な読み取り - Valgrind + C
-
[解決済み] エラー:整数が期待されるところで集約値が使用された
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】execvp: バッドアドレスエラー
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。