[解決済み] リンク時のグローバル変数への未定義参照
2022-02-08 02:02:02
質問
3つのモジュールに分けられたプログラムを、3つのソースファイルに対応させてコンパイルしようとしています。
a.c
,
b.c
および
z.c
.
z.c
には
main()
の関数を呼び出します。
a.c
と
b.c
. さらに
a.c
の関数を呼び出します。
b.c
その逆も同様です。最後に、グローバル変数
count
これは、3つのモジュールで使用され、別のヘッダーファイルで定義されています。
global.h
.
ソースファイルのコードは以下の通りです。
a.c
#include "global.h"
#include "b.h"
#include "a.h"
int functAb() {
functB();
functA();
return 0;
}
int functA() {
count++;
printf("A:%d\n", count);
return 0;
}
b.c
#include "global.h"
#include "a.h"
#include "b.h"
int functBa() {
functA();
functB();
return 0;
}
int functB() {
count++;
printf("B:%d\n", count);
return 0;
}
z.c
#include "a.h"
#include "b.h"
#include "global.h"
int main() {
count = 0;
functAb();
functBa();
return 0;
}
ヘッダーファイルです。
a.h
#ifndef A_H
#define A_H
#include <stdio.h>
int functA();
int functAb();
#endif
b.h
#ifndef B_H
#define B_H
#include <stdio.h>
int functB();
int functBa();
#endif
global.h
#ifndef GLOBAL_H
#define GLOBAL_H
extern int count;
#endif
そして、最後に
makefile
で、私のエラーを再現しています。
CC = gcc
CFLAGS = -O3 -march=native -Wall -Wno-unused-result
z: a.o b.o z.o global.h
$(CC) -o z a.o b.o z.o $(CFLAGS)
a.o: a.c b.h global.h
$(CC) -c a.c $(CFLAGS)
b.o: b.c a.h global.h
$(CC) -c b.c $(CFLAGS)
z.o: z.c a.h global.h
$(CC) -c z.c $(CFLAGS)
これで、オブジェクトをコンパイルすることができます。
a.o
,
b.o
および
z.o
でのリンクは問題ないのですが
make z
となります。
undefined reference to 'count'
をすべて表示します。
z.o: In function `main':
z.c:(.text.startup+0x8): undefined reference to `count'
a.o: In function `functAb':
a.c:(.text+0xd): undefined reference to `count'
a.c:(.text+0x22): undefined reference to `count'
a.o: In function `functA':
a.c:(.text+0x46): undefined reference to `count'
a.c:(.text+0x5b): undefined reference to `count'
b.o:b.c:(.text+0xd): more undefined references to `count' follow
collect2: ld returned 1 exit status
この最小限の例で、実際のコードでなんとかエラーを再現できたので、モジュール間の依存関係に問題があるのだと思うのですが、それを見抜くことができません。どなたか正しい方向性を示していただけませんか?
解決方法は?
を変更します。
z.c
に変更します。
#include "a.h"
#include "b.h"
#include "global.h"
int count; /* Definition here */
int main() {
count = 0;
functAb();
functBa();
return 0;
}
から
global.h
を継承し、すべてのファイルが
宣言
変数の
count
が
定義
がすべてのファイルで欠落しています。
として、いずれかのファイルに定義を追加する必要があります。
int count = some_value;
関連
-
[解決済み] c - 初期化がキャストなしでポインタから整数を作る、さらに2つのコンパイラーエラー
-
[解決済み】"Expected expression before ' { ' token"(トークンの前に期待される式)。
-
[解決済み】 strcpyとstrdupの比較
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】 switch case: error: case label does not reduce to an integer constant
-
[解決済み】EAGAINとはどういう意味ですか?
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み] コンパイル・リンクはどのように行われるのですか?
-
[解決済み】vtableへの未定義の参照
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み] (.text+0x20): `main'への未定義の参照と関数への未定義の参照
-
[解決済み] strtokのセグメンテーションフォールト
-
[解決済み】エラー:'for'ループの初期宣言はC99モードでしかできない【重複
-
[解決済み】「構造体でもユニオンでもないものにメンバー'*******'を要求する」とはどういう意味ですか?
-
[解決済み] struct has no member named
-
[解決済み】エラー。非スカラー型への変換を要求された
-
[解決済み】宣言指定子で2つ以上のデータ型がある場合のエラー【非公開
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】c - 警告:関数 'printf'の暗黙の宣言