2013-04-09 42 views
16

Tôi đã đọc các câu trả lời khác về chủ đề này và rất tiếc là chúng không giúp tôi. Tôi đang cố gắng liên kết một số chương trình c với nhau và tôi gặp lỗi khi phản hồi:Lỗi liên kết C: tham chiếu không xác định đến 'chính'

$ gcc -o runexp.o scd.o data_proc.o -lm -fopenmp 
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 
make: * [runexp] Error 1 

Tôi có chính xác một chức năng chính và đó là trong runexp. Biểu mẫu là

int main(void) { 
    ...; 
    return 0; 
} 

Bất kỳ suy nghĩ nào về lý do tôi có thể gặp phải lỗi này? Cảm ơn!

+0

là chức năng này ở phạm vi toàn cầu? –

+4

lệnh GCC của bạn không bao gồm runexp.c, nó OUTPUTS để chạyexp.o - chắc chắn bạn đang bao gồm tệp nguồn với phương thức chính? –

Trả lời

18

Bạn nên cung cấp tên tệp đầu ra sau tùy chọn -o. Trong trường hợp của bạn runexp.o được coi là tên tệp đầu ra, không phải là tệp đối tượng đầu vào và do đó, hàm main của bạn không được xác định.

+1

Hoặc chỉ cần xóa tùy chọn '-o' và sử dụng thông thường'./A.out', một tên đẹp;) –

3

Bạn không bao gồm tệp C có chứa main() khi biên dịch, vì vậy trình liên kết không nhìn thấy nó.

Bạn cần phải thêm nó:

$ gcc -o runexp runexp.c scd.o data_proc.o -lm -fopenmp 
1

Bạn đang ghi đè lên tập tin đối tượng của bạn runexp.o bằng cách chạy lệnh này:

gcc -o runexp.o scd.o data_proc.o -lm -fopenmp 

Trong thực tế, -o là cho đầu ra tập tin. Bạn cần phải chạy:

gcc -o runexp.out runexp.o scd.o data_proc.o -lm -fopenmp 

runexp.out sẽ là bạn tập tin nhị phân.

0

Thông thường, bạn biên dịch hầu hết các tệp .c theo cách sau:

gcc foo.c -o foo. Nó có thể thay đổi tùy thuộc vào #includes bạn đã sử dụng hoặc nếu bạn có bất kỳ tệp .h bên ngoài nào. Nói chung, khi bạn có một tập tin C, có vẻ hơi giống như sau:

#include <stdio.h> 
    /* any other includes, prototypes, struct delcarations... */ 
    int main(){ 
    */ code */ 
} 

Khi tôi nhận được một 'tài liệu tham khảo undefined to main', nó thường có nghĩa là tôi có một file .c mà không có int main() trong tập tin. Nếu bạn lần đầu tiên học java, đây là một cách hiểu của sự nhầm lẫn vì trong Java, mã của bạn thường trông giống như sau:

//any import statements you have 
public class Foo{ 
    int main(){} 
} 

tôi sẽ tư vấn tìm kiếm để xem nếu bạn có int main() ở đầu trang.

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