2013-03-15 62 views
14

Tôi mới vào lập trình Linux Tôi đã cố gắng biên dịch một thử nghiệm xây dựng đơn giản. Nhưng tôi gặp lỗi khi biên dịch. Thêm inc.c cũng (trong dòng ứng dụng:) không hoạt động. Tôi nên bao gồm tệp đúng cách như thế nào?Makefile bao gồm tiêu đề

Makefile:

app: main.c inc.h 
    cc -o app main.c 

Terminal:

make 
cc -o app main.c 
/tmp/ccGgdRNy.o: In function `main': 
main.c:(.text+0x14): undefined reference to `test' 
collect2: error: ld returned 1 exit status 
make: *** [app] Error 1 

main.c:

#include <stdio.h> 
#include "inc.h" 

int main() 
{ 
    printf("Kijken of deze **** werkt:\n"); 
    test(); 

    getchar(); 
    return 0; 
} 

inc.h

#ifndef INCLUDE_H 

#define INCLUDE_H 

void test(); 

#endif 

inc.c

#include <stdio.h> 

void test() 
{ 
    printf("Blijkbaar wel!"); 
} 

Trả lời

10

Bạn phải liên kết chống lại các đơn vị biên soạn inc.o mà bạn có được bằng cách biên dịch inc.c.

Nói chung có nghĩa là bạn phải cung cấp tất cả các tệp đối tượng có chứa các chức năng được sử dụng trong main.c (quá cảnh). Bạn có thể biên dịch các quy tắc này với các quy tắc ẩn của make, không cần chỉ định các quy tắc bổ sung.

Bạn có thể nói:

app: main.c inc.o inc.h 
    cc -o app inc.o main.c 

make sẽ biết tự mình làm thế nào để biên dịch inc.o từ inc.c mặc dù nó sẽ không mất inc.h vào tài khoản khi xác định liệu inc.o phải được xây dựng lại. Để biết rằng bạn sẽ phải chỉ định quy tắc của riêng bạn.

2

bạn không biên dịch các tập tin inc.c

app: main.c inc.h 
    cc -o app main.c inc.c 
-1

Bạn cần phải biên dịch inc.c là tốt. Một cách tiếp cận phù hợp (khả năng mở rộng tốt hơn cho các ứng dụng lớn hơn) sẽ là phân chia Makefile thành các mục tiêu khác nhau. Ý tưởng là: một mục tiêu cho mỗi tệp đối tượng, sau đó một mục tiêu cho tệp nhị phân cuối cùng. Để biên dịch các tệp đối tượng, hãy sử dụng đối số -c.

app: main.o inc.o 
    cc -o app main.o inc.o 

main.o: main.c inc.h 
    cc -c main.c inc.h 

inc.o: inc.c inc.h 
    cc -c inc.c inc.h 
+0

tại sao bạn đặt tệp tiêu đề trong 'cc -c main.c inc.h' và' cc -c inc.c inc.h'? – navigaid

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