2012-02-17 40 views
8

Như tôi biết, nếu tôi muốn sử dụng thư viện pthread trong môi trường Linux, tôi phải bao gồm pthread.h và biên dịch mã nguồn bằng tùy chọn -lpthread. Nhưng tôi không hiểu tại sao tôi nên biên dịch với tùy chọn -lpthread. Tôi nghĩ rằng các tùy chọn là dự phòng ... bởi vì tôi đã tuyên bố bao gồm tập tin tiêu đề pthread.h để gcc liên kết thư viện pthread. Tại sao gcc không tự động liên kết tệp thư viện pthread bằng cách đọC#include?tùy chọn -lpthread của gcc

Xin cảm ơn trước.

+3

Liên quan: http://stackoverflow.com/questions/2127797/gcc-significance-of-pthread-flag-when-compiling, bạn cũng nên sử dụng '-pthread'. – Mat

Trả lời

17

Vâng liên kếtbiên dịch là hai giai đoạn riêng biệt.

Bạn bao gồm tiêu đề pthread.h để trình biên dịch hiểu các loại dữ liệu & tên biểu tượng mà bạn sử dụng trong tệp nguồn nhưng được xác định/khai báo trong tệp tiêu đề thư viện pthread.

Bạn liên kết với libray pthread bằng cách sử dụng -lpthread để trình liên kết thực sự có thể tìm thấy các biểu tượng đó trong thư viện pthread trong giai đoạn liên kết.

+1

Vì vậy, tại sao chúng ta không phải bao gồm một số thư viện một cách rõ ràng để liên kết khi chúng ta sử dụng strcpy hoặc printf? Có phải vì tất cả các thư viện này đều nằm trong thư viện chuẩn C và được bao gồm theo mặc định hay không và bất kỳ thứ gì bên ngoài thư viện đó phải được liên kết rõ ràng? –

+0

@master_latch: vâng đó là lý do chính xác. –

3

Vì GCC không thực hiện auto-linking của thư viện được kích hoạt bằng cách đưa vào tiêu đề (trái ngược với MSVC, hoặc vì vậy tôi đã được thông báo).

+1

Có thực sự là một tùy chọn '# pragma' để liên kết trong một thư viện trong MSVC, nhưng nó rất hiếm khi được sử dụng (và thường được coi là thực hành xấu). –

2

Tệp tiêu đề chỉ khai báo hàm pthread là gì và chúng được gọi như thế nào. -lpthread liên kết đến chính thư viện, chứa các chức năng thực tế.

Trình biên dịch không biết làm thế nào bạn sẽ giải quyết các chức năng trong pthread.h. Bạn có thể muốn sử dụng một thư viện tĩnh, một thư viện được cung cấp bởi hệ thống, một số triển khai tương thích - heck, bạn có thể thực hiện chúng trong một tệp nguồn khác. It's up to linker, và không quan tâm đến trình biên dịch.

2

#include <pthread.h> trong mã của bạn không liên kết trong thư viện; nó chỉ bao gồm tiêu đề để biên dịch. Điều đó cho phép trình biên dịch xem các cấu trúc khác nhau, khai báo hàm, v.v. Có -lpthread thực sự khiến liên kết được thực hiện bởi trình liên kết. Vì vậy, bao gồm cho trình biên dịch những gì có sẵn, và -lpthread thực sự cho phép chương trình gọi các hàm trong thư viện vào thời gian chạy.

1

Bằng cách bao gồm các tệp tiêu đề bạn cho trình biên dịch biết các chức năng mà anh ta sẽ xem. Nhưng nếu các chức năng này nằm trong thư viện bên ngoài, chẳng hạn như các chức năng pthread, bạn cần phải liên kết thư viện này vào chương trình của mình để thực sự có thể truy cập các chức năng đó. Đó là những gì -lpthread đang làm.

1

Pthread.h tập tin tiêu đề được bao gồm trong chương trình chủ đề posix nhưng bạn cần -lpthread khi biên dịch vì nó liên kết nó với các thư viện pthread LƯU Ý:-lpthread-lpcap tất cả đều công tắc với trình biên dịch gcc mà có thể liên kết đặc biệt thư viện trong mã nguồn của chúng tôi. (lpthread nghĩa là thư viện "liên kết pthread")

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