Sự khác biệt giữa -pthread và -lpthread khi biên dịch


Câu trả lời:


116

-pthread yêu cầu trình biên dịch liên kết trong thư viện pthread cũng như cấu hình biên dịch cho các luồng.

Ví dụ: phần sau hiển thị các macro được xác định khi -pthreadtùy chọn được sử dụng trên gói GCC được cài đặt trên máy Ubuntu của tôi:

$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc          -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt 
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1

Việc sử dụng -lpthreadtùy chọn này chỉ khiến thư viện pthread được liên kết - các macro được xác định trước không được xác định.

Điểm mấu chốt: bạn nên sử dụng -pthreadtùy chọn.


Lưu ý: -pthreadtùy chọn này được ghi lại dưới dạng tùy chọn nền tảng cụ thể trong tài liệu GCC, vì vậy, nó có thể không phải lúc nào cũng có sẵn. Tuy nhiên, nó có sẵn trên các nền tảng mà tài liệu GCC không liệt kê rõ ràng nó (chẳng hạn như i386 và x86-64) - bạn nên sử dụng nó khi có sẵn.

Cũng lưu ý rằng các tùy chọn tương tự khác đã được GCC sử dụng, chẳng hạn như -pthreads(được liệt kê là từ đồng nghĩa với -pthreadtrên Solaris 2) và -mthread(hỗ trợ luồng dành riêng cho MinGW trên i386 và x86-64 Windows). Tôi hiểu rằng GCC đang cố gắng chuyển sang sử dụng -pthreadthống nhất trong tương lai.


2
Điều này thật kỳ lạ vì nó mâu thuẫn trực tiếp với POSIX. POSIX yêu cầu rằng việc vượt qua -lpthreadlà đủ để nhận toàn bộ thư viện phân luồng POSIX.
fuz

@FUZxxl Passing -lpthread không nhận được toàn bộ thư viện luồng POSIX.
user253751 21/02/16

5
@immibis Không, ý tôi là, POSIX nói rằng liên kết với -lpthreadphải là đủ để nhận được hỗ trợ pthreads đầy đủ. Không cần cờ biên dịch khác.
fuz

1
@alecov Điều sai với gcc là biên dịch với -lpthreadnhưng không phải -pthreadlà không đủ để nhận được hỗ trợ pthread, như tôi đã làm rõ trong nhận xét trước của mình.
fuz

2
@alecov POSIX yêu cầu pthreads phải hoạt động nếu bạn định cấu hình môi trường POSIX và liên kết với -lpthread. Tuy nhiên, tài liệu gcc cho thấy rằng điều này có thể không đủ để nhận được sự hỗ trợ của pthreads, đó là điểm tôi đã thực hiện qua các nhận xét trước. Tôi hoàn toàn không quan tâm đến điều gì sẽ xảy ra nếu bạn không cung cấp -lpthreadhoặc một số tùy chọn độc quyền ngẫu nhiên khác. Chỉ -lpthreadđược chỉ định bởi POSIX để đảm bảo pthreads và điều đó dường như không đủ với gcc.
fuz

10

-pthreadThê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à bộ liên kết ( man gcc).

trong khi

-lpthread tồn tại trong khi liên kết sẽ không có ảnh hưởng trong khi xử lý trước.


4

Có một câu trả lời được chấp nhận, nhưng IMO, nó không cung cấp đủ ngữ cảnh và thông tin chi tiết. Do đó câu trả lời bổ sung này.


-lpthread là một giải pháp cho một vấn đề không còn tồn tại (kể từ năm 2005).

Ngày xưa, đã có những triển khai độc quyền của API Pthreads không tuân theo POSIX, như LinuxThreads . Tiêu chuẩn POSIX chỉ đơn thuần nói rằng nếu một người muốn hành vi tuân thủ POSIX, thì người đó phải liên kết với -lpthreadvà liên kết được yêu cầu để liên kết việc triển khai tuân thủ POSIX của API Pthreads, nếu có nhiều triển khai của nó .

Không có nhiều triển khai API Pthreads trong các hệ điều hành hiện đại. Và đó là lý do tại sao -lpthreadkhông còn phục vụ bất kỳ mục đích nào.


Các trình biên dịch như gccclang(và có thể là tất cả các trình biên dịch tương thích với Linux) yêu cầu sử dụng -pthreadtùy chọn dòng lệnh cho cả việc biên dịch và liên kết các ứng dụng đa luồng tuân thủ POSIX và đó là những gì người ta phải sử dụng.

Tại thời điểm biên dịch, -pthreadtùy chọn biểu thị rằng API Pthread được yêu cầu (có thể có nhiều API phân luồng, ví dụ: Solaris Threads) và xác định các macro dành riêng cho nền tảng ( _REENTRANTtrên Linux , _MTtrên Solaris).

Tại thời điểm liên kết, -pthreadcác liên kết trong thư viện bắt buộc (nếu có) triển khai hành vi API Pthreads tuân thủ POSIX.

Phần trên làm rõ lý do tại sao -lpthreadkhông cần thiết cũng không đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.