2010-11-08 33 views
16

Khi tôi cố gắng biên dịch chương trình này, nó thất bại:Tại sao tôi nhận được lỗi "tham chiếu không xác định" ngay cả khi tôi bao gồm các tệp tiêu đề phù hợp?

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

void *WriteNumbers(void *threadArg) 
{ 
    int start, stop; 

    start = atoi((char *)threadArg); 
    stop = start + 10; 

    while (start < stop) 
    { 
     printf("%d\n", start++); 
     sleep(1); 
    } 
    return 0; 
} 

int main(int argc, char **argv) 
{ 
     pthread_t thread1, thread2; 

     // create the threads and start the printing 
     pthread_create(&thread1, NULL, WriteNumbers, (void *)argv[1]); 
     pthread_create(&thread2, NULL, WriteNumbers, (void *)argv[2]); 

     pthread_join(thread1, NULL); 
     pthread_join(thread2, NULL); 

     return 0; 
} 

Nó đã cho tôi những lỗi sau:

tmp/ccrW21s7.o: In function `main': 
pthread.c:(.text+0x83): undefined reference to `pthread_create' 
pthread.c:(.text+0xaa): undefined reference to `pthread_create' 
pthread.c:(.text+0xbd): undefined reference to `pthread_join' 
pthread.c:(.text+0xd0): undefined reference to `pthread_join' 
collect2: ld returned 1 exit status 

Tại sao nó lại cho tôi những lỗi tài liệu tham khảo không xác định mặc dù tôi đã bao gồm pthread.h, khai báo các chức năng này?

+1

Bạn cũng gặp các vấn đề khác: bạn không kiểm tra giá trị 'argc' nhưng bạn đang sử dụng giá trị của' argv'. Phương thức 'WriteNumbers' của bạn không trả về một giá trị. – dreamlax

+0

@dreamlax: Tôi đã khắc phục sự cố 'không trả lại'; Tôi đã không nhận thấy vấn đề argc/argv. –

Trả lời

23

Bạn có thể quên liên kết với thư viện Pthreads (sử dụng -lpthread trên dòng lệnh).

+8

Tôi đã thêm thẻ này vào thẻ wiki làm Câu hỏi thường gặp. Câu hỏi này được hỏi vào đầu mỗi học kỳ mùa thu :) –

+1

@ máu lạnh tại sao bạn không chấp nhận câu trả lời này? – Mawg

3

Bạn cần liên kết pthread thư viện để nhị phân của bạn, như thế này:

cc -o myapp myapp.c -lpthread 
21

Những người khác đã nói rằng bạn chưa liên kết với thư viện pthread sử dụng -lpthread cờ. GCC hiện đại (không chắc chắn cách hiện đại, của tôi là 4.3.3) cho phép bạn sử dụng chỉ -pthread. Từ trang người đàn ông:

-pthread
Thêm hỗ trợ cho đa luồng với thư viện pthreads. Tùy chọn này đặt cờ cho cả bộ tiền xử lý và trình liên kết.

+0

Thực ra, đó là gcc "cũ" cho phép điều đó. The -pthread là cú pháp rất cũ, và chỉ được cung cấp cho khả năng tương thích với các trình biên dịch cũ hơn mà không có hỗ trợ-l ... –

+1

@WouterVerhelst Tôi không nghĩ đó là sự thật. '-pthread' vẫn là cờ được đề nghị để sử dụng, bởi vì nó cũng đặt bất kỳ tiền xử lý bắt buộc và cờ biên dịch nào, trong khi' -lpthread' chỉ hướng liên kết để liên kết đến libpthread. –

1

Do

gcc -pthread -o name filename.c (cpp) 

để biên dịch chương trình, sau đó

./name 

để chạy chương trình.

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