2012-04-27 36 views
16

Được rồi, tôi đã cố gắng làm việc với điều này trong thời gian dài nhất và tôi dường như không thể làm cho nó hoạt động đúng. Tôi có ba tệp, main.c, hello_world.chello_world.h. Vì lý do nào đó, chúng dường như không biên dịch tốt, và tôi thực sự không thể hiểu tại sao ...Vấn đề tiêu đề C: #include và "tham chiếu không xác định"

Đây là các tệp nguồn của tôi. hello_world.c đầu tiên:

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

int hello_world(void) { 
    printf("Hello, Stack Overflow!\n"); 
    return 0; 
} 

Sau đó hello_world.h, đơn giản:

int hello_world(void); 

Và cuối cùng main.c:

#include "hello_world.h" 

int main() { 
    hello_world(); 
    return 0; 
} 

Khi tôi đặt nó vào GCC, đây là những gì Tôi nhận được:

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

Bất kỳ ai cũng có thể giúp tôi? Tôi thực sự bị mắc kẹt về điều này, nhưng tôi 99 phần trăm chắc chắn đó là một sửa chữa thực sự đơn giản.

Trả lời

35
gcc main.c hello_world.c -o main 

Ngoài ra, luôn luôn sử dụng bảo vệ tiêu đề:

#ifndef HELLO_WORLD_H 
#define HELLO_WORLD_H 

/* header file contents go here */ 

#endif /* HELLO_WORLD_H */ 
+1

Cảm ơn! Một trong những điều nhỏ nhặt mà chuyến đi lập trình. :) – user1018501

+1

Mặc dù các tiêu đề bảo vệ là không cần thiết (trong ví dụ này) đó là một gợi ý tốt – KevinDTimm

+1

@ user1018501: Nếu câu trả lời này giải quyết được vấn đề của bạn, bạn nên chấp nhận nó. – Job

3

Bạn nên liên kết tập tin đối tượng compled từ hello_world.c tập tin .c thứ hai của bạn với main.o bạn

thử này

cc -c main.c 
cc -c hello_world.c 
cc *.o -o hello_world 
8

Bạn không bao gồm hello_world.c trong quá trình biên dịch.

gcc hello_world.c main.c -o main 
4

Bạn không liên kết với hello_world.c.

Một cách dễ dàng để làm điều này là để chạy lệnh này biên soạn:

dự án

cc -o main main.c hello_world.c

phức tạp hơn thường sử dụng xây dựng các kịch bản hay tạo file ảnh mà tách biên soạn và liên kết lệnh, nhưng lệnh trên (kết hợp cả hai bước) nên làm tốt cho các dự án nhỏ.

+0

Có, bạn chắc chắn nên tìm hiểu về 'make' (hoặc các hệ thống xây dựng tốt hơn, như' omake') –

1

Có vẻ như bạn đã quên liên kết hello_world.c. Tôi sẽ là gcc hello_world.c main.c -o chính. Nếu số lượng tệp ít hơn, chúng tôi có thể sử dụng phương pháp này nhưng trong các dự án lớn hơn thì tốt hơn để sử dụng Tạo tệp hoặc một số tập lệnh biên dịch.