Perbedaan antara -pthread dan -lpthread saat kompilasi

Jawaban:

116

-pthread memberi tahu kompilator untuk menautkan di pustaka pthread serta mengkonfigurasi kompilasi untuk utas.

Misalnya, berikut ini menunjukkan makro yang ditentukan saat -pthreadopsi digunakan pada paket GCC yang diinstal di mesin Ubuntu saya:

$ 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

Menggunakan -lpthreadopsi ini hanya menyebabkan pustaka pthread ditautkan - makro yang telah ditentukan sebelumnya tidak dapat ditentukan.

Intinya: Anda harus menggunakan -pthreadopsi.


Catatan: -pthreadopsi ini didokumentasikan sebagai opsi khusus platform di dokumen GCC, jadi mungkin tidak selalu tersedia. Namun, ini tersedia pada platform yang dokumen GCC tidak mencantumkannya secara eksplisit (seperti i386 dan x86-64) - Anda harus menggunakannya jika tersedia.

Perhatikan juga bahwa opsi serupa lainnya telah digunakan oleh GCC, seperti -pthreads(terdaftar sebagai sinonim untuk -pthreadSolaris 2) dan -mthread(untuk dukungan utas khusus MinGW di i386 dan x86-64 Windows). Pemahaman saya adalah bahwa GCC sedang mencoba untuk beralih menggunakan -pthreadseragam ke depannya.

Michael Burr
sumber
2
Yang aneh karena secara langsung bertentangan dengan POSIX. POSIX mengamanatkan bahwa passing -lpthreadcukup untuk mendapatkan seluruh pustaka threading POSIX.
fuz
@FUZxxl Passing -lpthread memang mendapatkan seluruh perpustakaan threading POSIX.
pengguna253751
5
@immibis Tidak, maksud saya adalah, POSIX mengatakan bahwa menghubungkan dengan -lpthreadharus cukup untuk mendapatkan dukungan penuh pthreads. Tidak ada tanda kompilasi lain yang diperlukan.
fuz
1
@alecov Apa yang salah dengan gcc adalah bahwa mengkompilasi dengan -lpthreadtetapi tidak tidak -pthreadcukup untuk mendapatkan dukungan pthread, seperti yang sudah saya jelaskan dalam komentar saya sebelumnya.
fuz
2
@alecov POSIX mengamanatkan bahwa pthreads harus berfungsi jika Anda mengkonfigurasi lingkungan POSIX dan menautkannya -lpthread. Namun, dokumentasi gcc menunjukkan bahwa ini mungkin tidak cukup untuk mendapatkan dukungan pthreads, yang merupakan poin yang saya buat melalui komentar sebelumnya. Saya tidak peduli sama sekali tentang apa yang terjadi jika Anda tidak memberikan -lpthreadatau beberapa opsi kepemilikan acak lainnya. Hanya -lpthreadditentukan oleh POSIX untuk menjamin pthreads dan tampaknya tidak cukup dengan gcc.
fuz
10

-pthreadMenambahkan dukungan untuk multithreading dengan pustaka pthreads. Opsi ini menyetel tanda untuk preprocessor dan linker ( man gcc).

sementara

-lpthread muncul sementara penautan tidak akan ada pengaruh saat praproses.

Praveen Kumar
sumber
4

Ada jawaban yang diterima, tetapi, IMO, itu tidak memberikan konteks dan wawasan yang cukup. Karenanya jawaban ekstra ini.


-lpthread adalah solusi untuk masalah yang sudah tidak ada lagi (sejak ~ 2005).

Di masa lalu ada implementasi kepemilikan dari Pthreads API yang tidak sesuai dengan POSIX, seperti LinuxThreads . Standar POSIX hanya mengatakan bahwa jika seseorang menginginkan perilaku yang sesuai dengan POSIX, maka ia harus menautkan -lpthread, dan penautan yang diperlukan untuk menautkan implementasi Pthreads API yang sesuai dengan POSIX, jika ada banyak penerapannya .

Tidak ada banyak implementasi Pthreads API dalam sistem operasi modern. Dan itulah mengapa -lpthreadtidak lagi melayani tujuan apa pun.


Kompiler seperti gccdan clang(dan, mungkin, semua kompiler yang kompatibel dengan Linux) memerlukan penggunaan -pthreadopsi baris perintah untuk kompilasi dan penautan aplikasi multi-thread yang sesuai dengan POSIX dan itulah yang harus digunakan.

Pada waktu kompilasi, -pthreadopsi memanifestasikan bahwa Pthread API diminta (mungkin ada beberapa API penguliran, misalnya Solaris Threads) dan mendefinisikan makro khusus platform ( _REENTRANTdi Linux , _MTdi Solaris).

Pada waktu penautan, -pthreadtautan di pustaka yang diperlukan (jika ada) yang menerapkan perilaku API Pthreads yang sesuai dengan POSIX.

Di atas menjelaskan mengapa -lpthreadtidak perlu atau cukup.

Maxim Egorushkin
sumber