2015-01-22 18 views
12

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.cz.c. z.c chứa hàm main(), gọi hàm số a.cb.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?

Trả lời

13

Thay đổi của bạn z.c để

#include "a.h" 
#include "b.h" 
#include "global.h" 

int count; /* Definition here */ 
int main() { 
    count = 0; 
    functAb(); 
    functBa(); 
    return 0; 
} 

Từ global.h, tất cả các file của bạn được thừa hưởng khai của biến count nhưng nét là mất tích từ tất cả các file.

Bạn phải thêm định nghĩa cho một trong những nội dung tập tin int count = some_value;

+0

Có thể "int count" nằm bên trong chức năng chính không? – Taozi

+1

@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. –

6

Bạn đã tuyên bố đếm, không định nghĩa nó.

extern là một phần của tuyên bố chứ không phải định nghĩa.

Để rõ ràng, extern là bộ định danh lớp lưu trữ và được sử dụng khi khai báo.

Bạn cần phải xác địnhint count ở đâu đó trong tệp nguồn của bạn.

1

Bạn phải thêm int count; vào tệp z.c của mình. Điều này vì khai báo một biến trong tệp tiêu đề là extern cho trình biên dịch biết rằng biến sẽ được khai báo trong tệp khác, nhưng biến chưa được khai báo và sẽ được giải quyết b liên kết.

Sau đó, bạn cần khai báo biến ở đâu đó.

Các vấn đề liên quan