Derleme sırasında -pthread ve -lpthread arasındaki fark


Yanıtlar:


116

-pthread derleyiciye pthread kitaplığına bağlanmasını ve evreler için derlemeyi yapılandırmasını söyler.

Örneğin, aşağıda -pthreadUbuntu makinemde kurulu GCC paketinde seçenek kullanıldığında tanımlanan makrolar gösterilmektedir :

$ 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

Kullanma -lpthreadseçeneği yalnızca pthread kütüphane bağlantılı neden olur - önceden tanımlanmış makro tanımlanmadığı alamadım.

Alt satır: -pthreadseçeneği kullanmalısınız .


Not: Bu -pthreadseçenek, GCC belgelerinde platforma özgü bir seçenek olarak belgelenmiştir, bu nedenle her zaman mevcut olmayabilir. Bununla birlikte, GCC belgelerinin açıkça listelemediği platformlarda mevcuttur (i386 ve x86-64 gibi) - mümkün olduğunda kullanmalısınız.

Ayrıca -pthreads( -pthreadSolaris 2'de eşanlamlı olarak listelenmiştir ) ve -mthread(i386 ve x86-64 Windows'ta MinGW'ye özgü iş parçacığı desteği için ) gibi diğer benzer seçeneklerin GCC tarafından kullanıldığını unutmayın . Anladığım kadarıyla, GCC, -pthreadtekdüze bir şekilde ileriye doğru gitmeye çalışıyor .


2
Bu garip çünkü doğrudan POSIX ile çelişiyor. POSIX, geçişin -lpthreadtüm POSIX iş parçacığı kitaplığını almak için yeterli olduğunu belirtir .
2016

@FUZxxl Geçer -lpthread yapar bütün POSIX iş parçacığı kütüphanesi olsun.
user253751

5
@immibis Hayır, demek istediğim POSIX, -lpthreadtam pthreads desteği almak için bağlantı kurmanın yeterli olması gerektiğini söylüyor . Başka hiçbir derleme bayrağına ihtiyaç duyulmamalıdır.
fuz

1
@alecov gcc ile ilgili yanlış olan şey, önceki yorumumda daha önce açıkladığım gibi, pthread desteği almak için yeterli -lpthreadolmamakla birlikte derlemenin -pthreadyetersiz olmasıdır.
fuz

2
@alecov POSIX, bir POSIX ortamı yapılandırır ve ile bağlantı kurarsanız pthreads'ın çalışması gerektiğini belirtir -lpthread. Bununla birlikte, gcc belgeleri bunun pthreads desteği almak için yetersiz olabileceğini öne sürüyor, bu da önceki yorumlarda belirttiğim nokta. -lpthreadBaşka tescilli seçenekler sunmazsanız veya bazı rastgele seçenekler sunmazsanız ne olacağı hiç umrumda değil . Yalnızca -lpthreadPOSIX tarafından pthreads garanti etmek için belirtilmiştir ve bu gcc için yeterli görünmemektedir.
fuz

10

-pthreadPthreads kitaplığıyla çoklu okuma için destek ekler. Bu seçenek hem önişlemci hem de linker ( man gcc) için bayrakları ayarlar .

süre

-lpthread bağlantı kurulurken ortaya çıkar, ön işleme sırasında hiçbir etkisi olmayacaktır.


4

Kabul edilen bir cevap var, ancak IMO, yeterli bağlam ve içgörü sağlamıyor. Dolayısıyla bu ekstra cevap.


-lpthread artık var olmayan bir sorun için bir çözümdür (~ 2005'ten beri).

Eskiden, LinuxThreads gibi POSIX uyumlu olmayan tescilli Pthreads API uygulamaları vardı . POSIX standardı sadece biri o POSIX uyumlu davranış, bir zorunluluk bağlantı ile istiyorsa söyler ve bu Pthreadler API POSIX uyumlu uygulanmasını bağlanması için gerekli olan Bağlama işlemi, bunun birçok uygulamaları olmalıdır .-lpthread

Modern işletim sistemlerinde birden fazla Pthreads API uygulaması yoktur. Ve bu yüzden -lpthreadartık herhangi bir amaca hizmet etmiyor.


Derleyiciler gibi gccve clang(ve muhtemelen tüm Linux uyumlu derleyiciler) gerektirir kullanarak -pthreadhem derleme ve POSIX uyumlu çok uçlu uygulamalarda bağlama ve bu bir kullanmalıdır ne için komut satırı seçeneği.

Derleme zamanında, -pthreadseçenek Pthread API'nin talep edildiğini gösterir (birden fazla iş parçacığı API'si olabilir, örn. Solaris Threads) ve platforma özgü makroları ( _REENTRANTLinux'ta , _MTSolaris'te) tanımlar .

Bağlantı zamanında, -pthreadPOSIX uyumlu Pthreads API davranışını uygulayan gerekli kitaplıklardaki (varsa) bağlantılar.

Yukarıdakiler, neden -lpthreadgerekli veya yeterli olmadığını açıkça ortaya koymaktadır .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.