1. ホーム
  2. c

[解決済み] リンク時のグローバル変数への未定義参照

2022-02-08 02:02:02

質問

3つのモジュールに分けられたプログラムを、3つのソースファイルに対応させてコンパイルしようとしています。 a.c , b.c および z.c . z.c には main() の関数を呼び出します。 a.cb.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;