Tôi đang cố gắng biên dịch chương trình được chia thành 3 mô-đun, tương ứng với 3 tệp nguồn: a.c
, b.c
và z.c
. z.c
chứa hàm main()
, gọi hàm số a.c
và b.c
. Hơn nữa, một hàm trong a.c
gọi một hàm trong b.c
và ngược lại. Cuối cùng, có một biến toàn cầu count
được sử dụng bởi ba mô-đun và được định nghĩa trong một tệp tiêu đề riêng biệt, global.h
.Tham chiếu không xác định đến biến toàn cầu trong khi liên kết
Các mã của file nguồn như sau:
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;
}
Các tập tin tiêu đề:
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
Và, cuối cùng, makefile
rằng tái tạo lỗi của tôi:
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)
Với điều này, tôi có thể biên dịch các đối tượng a.o
, b.o
, và z.o
tốt, nhưng, khi liên kết với make z
, tôi nhận được undefined reference to 'count'
trong tất cả trong số họ:
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
tôi cố gắng sao chép các lỗi trong mã thực tế của tôi trong ví dụ tối thiểu này, vì vậy tôi đoán có một vấn đề trong sự phụ thuộc giữa các mô-đun, nhưng tôi không thể phát hiện ra nó. ai đó có thể chỉ cho tôi phương hướng đúng không?
Có thể "int count" nằm bên trong chức năng chính không? – Taozi
@Taozi Không, nó sẽ làm cho 'đếm' biến cục bộ. Chúng ta cần định nghĩa toàn cầu. –