2011-11-01 36 views
25

Tôi đang cố gắng để biên dịch một chương trình (gọi tắt là ES3), nhưng, khi tôi viết từ thiết bị đầu cuối:tham khảo Không xác định để chính - collect2: ld trở về 1 exit status

gcc es3.c -o es3

nó xuất hiện tin nhắn này:

/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: ld returned 1 exit status 

Tôi có thể làm gì?

+0

Có thể là một ý tưởng hay khi đăng mã gây ra lỗi này. – Lundin

+1

@BrandoSK: Khi tôi theo liên kết đó, tôi nhận được đếm ngược 45 giây. Hãy đăng mã như một phần của câu hỏi của bạn hoặc thu hẹp mã xuống một ví dụ nhỏ minh họa sự cố và đăng vấn đề đó. –

+0

Ok, tôi vừa tải xuống tệp nguồn của bạn. (1) Nó được gọi là 'es3_f3.c', không phải' es3.c'. (2) Nó chứa nhiều lỗi, ví dụ một dấu chấm phẩy còn thiếu trên dòng 18. Nó có thể không được biên dịch, có nghĩa là bạn không thể đi đủ xa để thấy lỗi liên kết mà bạn báo cáo. Cho chúng tôi thấy mã thực của bạn. (Tệp nguồn được tải xuống là 73 dòng, đủ ngắn để đăng trực tiếp tại đây.) –

Trả lời

38

Điều này có nghĩa là es3.c không xác định chức năng main và bạn đang cố tạo một tệp thực thi. Một tệp thực thi cần phải có một điểm vào, do đó trình liên kết phàn nàn.

Để biên dịch chỉ đến một tập tin đối tượng, sử dụng -c tùy chọn:

gcc es3.c -c 
gcc es3.o main.c -o es3 

Trên đây biên dịch es3.c đến một tập tin đối tượng, sau đó biên dịch một file main.c rằng sẽ chứa các main chức năng, và các mối liên kết kết hợp es3.omain.o vào tệp thi hành được gọi là es3.

+2

vấn đề là tôi đặt chức năng chính trong chương trình của mình .. Tôi không hiểu tại sao Nó nói rằng không có chức năng chính ...:/ – bransharp

2

Tệp thực thi cần có chức năng chính. Xem dưới đây giới thiệu bản demo thế giới.

#include <stdio.h> 
int main(void) 
{ 
     printf("Hello world!\n"); 
     return 0; 
} 

Như bạn có thể thấy có chức năng chính. nếu bạn không có chức năng chính này, ld sẽ báo cáo "tài liệu tham khảo không xác định đến chính"

kiểm tra kết quả của tôi:

$ cat es3.c 
#include <stdio.h> 
int main(void) 
{ 
    printf("Hello world!\n"); 
    return 0; 
} 
$ gcc -Wall -g -c es3.c 
$ gcc -Wall -g es3.o -o es3 
~$ ./es3 
Hello world! 

xin vui lòng sử dụng $ objdump -t es3.o để kiểm tra nếu có một biểu tượng chính. Dưới đây là kết quả của tôi.

$ objdump -t es3.o 

es3.o:  file format elf32-i386 

SYMBOL TABLE: 
00000000 l df *ABS* 00000000 es3.c 
00000000 l d .text 00000000 .text 
00000000 l d .data 00000000 .data 
00000000 l d .bss 00000000 .bss 
00000000 l d .debug_abbrev 00000000 .debug_abbrev 
00000000 l d .debug_info 00000000 .debug_info 
00000000 l d .debug_line 00000000 .debug_line 
00000000 l d .rodata  00000000 .rodata 
00000000 l d .debug_frame 00000000 .debug_frame 
00000000 l d .debug_loc  00000000 .debug_loc 
00000000 l d .debug_pubnames  00000000 .debug_pubnames 
00000000 l d .debug_aranges 00000000 .debug_aranges 
00000000 l d .debug_str  00000000 .debug_str 
00000000 l d .note.GNU-stack  00000000 .note.GNU-stack 
00000000 l d .comment  00000000 .comment 
00000000 g  F .text 0000002b main 
00000000   *UND* 00000000 puts 
+0

cảm ơn câu trả lời của bạn, nhưng tôi có chức năng chính bên trong chương trình của mình: ( không hiểu tại sao trình biên dịch không đọc nó :( – bransharp

+0

Tôi đã xác minh trên linux của mình, – Daniel

+1

Tôi tin rằng bạn không thực sự có một chính, nó bị che khuất, bỏ qua các bộ tiền xử lý, làm nội bộ hoặc tĩnh ... Hãy thử để 'indent' tập tin của bạn, nó sẽ dễ đọc hơn cho bạn ... –

10

Có lẽ chức năng main của bạn đã được nhận xét vì ví dụ: sơ chế. Để tìm hiểu xem tiền xử lý đang làm gì, hãy thử gcc -C -E es3.c > es3.i rồi tìm trình chỉnh sửa vào tệp es3.i đã tạo (và tìm kiếm main bên trong nó).

Trước tiên, bạn nên luôn luôn (vì bạn là một newbie) biên dịch với

gcc -Wall -g -c es3.c 
    gcc -Wall -g es3.o -o es3 

Cờ -Wall là vô cùng quan trọng, và bạn nên luôn luôn sử dụng nó. Nó cho trình biên dịch cung cấp cho bạn (gần như) tất cả các cảnh báo. Và bạn nên luôn luôn lắng nghe các cảnh báo, tức là sửa tập tin mã nguồn của bạn es3.C cho đến khi bạn không còn cảnh báo nữa.

Cờ -g cũng rất quan trọng vì nó yêu cầu gcc để đặt thông tin gỡ lỗi vào tệp đối tượng và tệp thi hành. Sau đó, bạn có thể sử dụng trình gỡ lỗi (như gdb) để gỡ lỗi chương trình của mình.

Để nhận danh sách biểu tượng trong tệp đối tượng hoặc tệp thực thi, bạn có thể sử dụng nm.

Tất nhiên, tôi giả sử bạn sử dụng hệ thống GNU/Linux (và tôi mời bạn sử dụng GNU/Linux nếu bạn chưa sử dụng nó).

+0

vâng tôi đang sử dụng Ubuntu! Tôi sẽ đi và thử những gì bạn đang nói cảm ơn ..! – bransharp

0

Một khả năng chưa được đề cập cho đến nay là bạn có thể không chỉnh sửa tệp mà bạn cho là bạn đang có. tức là trình soạn thảo của bạn có thể có một cwd khác với bạn đã có trong tâm trí.

Chạy 'thêm' trên tệp bạn đang biên soạn để kiểm tra kỹ xem nó có thực sự có nội dung bạn mong muốn không. Hy vọng rằng sẽ giúp!

0

Bạn chỉ có thể thêm một hàm main để giải quyết vấn đề này. Giống như:

int main() 
{ 
    return 0; 
} 
Các vấn đề liên quan