Apa perbedaan antara gcc -pthread
dan gcc -lpthread
yang digunakan saat menyusun program multithread?
Apa perbedaan antara gcc -pthread
dan gcc -lpthread
yang digunakan saat menyusun program multithread?
Jawaban:
-pthread
memberi tahu kompilator untuk menautkan di pustaka pthread serta mengkonfigurasi kompilasi untuk utas.
Misalnya, berikut ini menunjukkan makro yang ditentukan saat -pthread
opsi 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 -lpthread
opsi ini hanya menyebabkan pustaka pthread ditautkan - makro yang telah ditentukan sebelumnya tidak dapat ditentukan.
Intinya: Anda harus menggunakan -pthread
opsi.
Catatan: -pthread
opsi 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 -pthread
Solaris 2) dan -mthread
(untuk dukungan utas khusus MinGW di i386 dan x86-64 Windows). Pemahaman saya adalah bahwa GCC sedang mencoba untuk beralih menggunakan -pthread
seragam ke depannya.
-lpthread
cukup untuk mendapatkan seluruh pustaka threading POSIX.
-lpthread
memang mendapatkan seluruh perpustakaan threading POSIX.
-lpthread
harus cukup untuk mendapatkan dukungan penuh pthreads. Tidak ada tanda kompilasi lain yang diperlukan.
-lpthread
tetapi tidak tidak -pthread
cukup untuk mendapatkan dukungan pthread, seperti yang sudah saya jelaskan dalam komentar saya sebelumnya.
-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 -lpthread
atau beberapa opsi kepemilikan acak lainnya. Hanya -lpthread
ditentukan oleh POSIX untuk menjamin pthreads dan tampaknya tidak cukup dengan gcc.
-pthread
Menambahkan 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.
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 -lpthread
tidak lagi melayani tujuan apa pun.
Kompiler seperti gcc
dan clang
(dan, mungkin, semua kompiler yang kompatibel dengan Linux) memerlukan penggunaan -pthread
opsi baris perintah untuk kompilasi dan penautan aplikasi multi-thread yang sesuai dengan POSIX dan itulah yang harus digunakan.
Pada waktu kompilasi, -pthread
opsi memanifestasikan bahwa Pthread API diminta (mungkin ada beberapa API penguliran, misalnya Solaris Threads) dan mendefinisikan makro khusus platform ( _REENTRANT
di Linux , _MT
di Solaris).
Pada waktu penautan, -pthread
tautan di pustaka yang diperlukan (jika ada) yang menerapkan perilaku API Pthreads yang sesuai dengan POSIX.
Di atas menjelaskan mengapa -lpthread
tidak perlu atau cukup.