2011-08-16 41 views
5
/me/home/file1.c containes function definition: 

int mine(int i) 
{ 
    /* some stupidity by me */ 
} 

Tôi đã tuyên bố chức năng này trongsử dụng một hàm trong file .c khác nhau (c lập trình 101)

/me/home/file1.h 

int mine(int); 

nếu tôi muốn sử dụng chức năng này mine() trong /me/home/at/file2.c

Để làm như vậy , tất cả những gì tôi cần làm là:

file2.c 

#include "../file1.h" 

Vậy là đủ chưa? Chắc là không.

Sau khi làm điều này nhiều, khi tôi biên dịch file2.c, tôi nhận được undefined reference to 'mine'

Trả lời

6

Bạn cũng sẽ cần phải liên kết các đối tượng tập tin từ file1. Ví dụ:

gcc -c file2.c 
gcc -c ../file1.c 
gcc -o program file2.o file1.o 

Hoặc bạn cũng có thể cho tất cả các tệp cùng một lúc và để GCC thực hiện công việc (không được đề xuất ngoài một số tệp);

gcc -o program file1.c file2.c 
+0

Cảm ơn Yann. Làm thế nào tôi có thể làm điều này trong một Makefile? – hari

+1

Nói chung, bạn có thể lấy đi với chỉ định các tập tin đối tượng duy nhất, và GCC là đủ thông minh để làm phần còn lại. I.e .: 'chương trình: file1.o file2.o \ n \ tgcc -o chương trình tập tin1.o file2.o' –

+0

Cảm ơn nhiều vì sự giúp đỡ nhanh chóng. – hari

1

Không sử dụng ../ trong tiêu đề. Thay vào đó, hướng dẫn gcc để sử dụng thư mục mẹ như bao gồm đường dẫn:

(ở tại thư mục):

gcc -I../ -c file2.c 
+0

Đôi khi có những lý do chính đáng để không làm -I ../, tôi sẽ không đi xa như vậy để nói "không sử dụng ../" là một quy tắc chung tốt. – George

1

Sau khi làm điều này nhiều, khi tôi biên dịch file2.c, tôi nhận được tài liệu tham khảo không xác định để 'mine'

Không, bạn không. Nó không biên dịch mà gây ra những lỗi đó. Đó là thứ khác, được gọi là "liên kết".

Trình biên dịch biên dịch một "đơn vị dịch" - kết quả chạy bộ xử lý trước trên một tệp nguồn, có thể kéo nhiều thứ hơn qua #include - tại một thời điểm, và sau đó trình liên kết kết hợp chúng lại với nhau để thực thi. Thông thường, chương trình tương tự như trình biên dịch và trình liên kết, với các cờ khác nhau, và thông thường bạn có thể yêu cầu nó làm mọi thứ cùng một lúc (và không lưu bất kỳ tệp tạm thời nào cho các đơn vị dịch được biên dịch). Nhưng bạn cần phải nói cho nó những gì để liên kết, và bạn cần phải biên dịch tất cả mọi thứ sẽ được liên kết.

+0

Cảm ơn câu trả lời chi tiết. – hari

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