2013-02-27 38 views
5

Tôi đang sử dụng nhật thực trên Fedora 17 (với GCC) và tôi có tham chiếu không xác định trên pthread_create(), ngay cả khi pthread.h được bao gồm và nếu tôi có -lpthread trên dòng lệnh gcc build. ..thư viện pthread tham chiếu không xác định

đây là mã của tôi, chỉ trong trường hợp

void* repair() 
{ 
    int var; 
    for (var = 0; var < NB_ITER ; var += 2) 
    { 
     printf("PAIR : %d\n", var); 
    } 

return NULL; 
} // pair 

void exo03() 
{ 
    pthread_t id1; 
    pthread_create(&id1, NULL, &repair, NULL); 
} 

Cảm ơn bạn đã giúp đỡ :)

+1

Có thể bạn đã quên liên kết với thư viện pthread. Thêm '-lpthread' trong lệnh biên dịch của bạn làm lệnh cuối cùng. –

+0

Bạn có thể cung cấp một ví dụ đầy đủ và lưu ý chính xác về lệnh biên dịch + lỗi không? – simonc

Trả lời

8

trên linux, FreeBSD (và một số hương vị * nix khác), bạn nên sử dụng tùy chọn biên dịch -pthread và không cố liên kết với thư viện pthread.

Đối eclipse:

Eclipse không được cấu hình để đưa lập luận -pthread trong gcc biên dịch. Để giải quyết việc này, hãy vào Menu:

Project -> Properties

c/C++ xây dựng -> GCC C Compiler -> Miscellaneous

Thêm “-pthread” đối số vào đầu “ Flags khác”

Ngoài ra hãy vào:

c/C++ xây dựng -> Settings -> GCC C Linker -> Libraries

Và bao gồm“pthread ”Thư viện vào các thư viện khác. Nhấp vào Áp dụng và xây dựng lại dự án. Pthreads phải làm việc ngay bây giờ.

Từ man gcc:

-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.

Tôi tìm thấy một explanation here:

Trong GCC, các (aka -pthreads) tùy chọn -pthread quản lý cả hai trình biên dịch Preprocessor/và/mối liên kết để cho phép biên soạn với chủ đề Posix. Các preprocessor sẽ xác định/bật/sử dụng Posix Các luồng phiên bản của một số macro (hoặc thực hiện biên soạn có điều kiện để cho phép Posix đề logic), và các mối liên kết sẽ đặc biệt liên kết các đối tượng kết quả chống libpthread

Tuy nhiên, -lpthread chỉ yêu cầu trình liên kết cố gắng giải quyết bất kỳ tham chiếu bên ngoài nào đối với thư viện libpthread, giống như cách mà -lm yêu cầu trình liên kết cố gắng giải quyết bất kỳ tham chiếu nào bên ngoài thư viện libm. Đối với giao diện người dùng, mã của bạn có thể không chứa tham chiếu bên ngoài để libpthread, ngay cả khi bạn đã viết Posix mã chuỗi, vì các macro quan trọng chưa được bật.

+0

Tại sao không liên kết với libpthread? –

+0

@ bash.d: vì không có tùy chọn '-pthread', trình soạn thảo và trình liên kết sẽ không tìm thấy thư viện pthread chính xác :) –

+0

Được rồi, cảm ơn bạn, tôi đã quên điều này! –

4

Bạn đã liên kết với libpthread chưa?

$> gcc ... -lpthread 
Các vấn đề liên quan