Çok iş parçacıklı programları derlerken kullanılan gcc -pthread
ve arasındaki fark nedir gcc -lpthread
?
Çok iş parçacıklı programları derlerken kullanılan gcc -pthread
ve arasındaki fark nedir gcc -lpthread
?
Yanıtlar:
-pthread
derleyiciye pthread kitaplığına bağlanmasını ve evreler için derlemeyi yapılandırmasını söyler.
Örneğin, aşağıda -pthread
Ubuntu 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 -lpthread
seçeneği yalnızca pthread kütüphane bağlantılı neden olur - önceden tanımlanmış makro tanımlanmadığı alamadım.
Alt satır: -pthread
seçeneği kullanmalısınız .
Not: Bu -pthread
seç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
( -pthread
Solaris 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, -pthread
tekdüze bir şekilde ileriye doğru gitmeye çalışıyor .
-lpthread
tüm POSIX iş parçacığı kitaplığını almak için yeterli olduğunu belirtir .
-lpthread
yapar bütün POSIX iş parçacığı kütüphanesi olsun.
-lpthread
tam 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.
-lpthread
olmamakla birlikte derlemenin -pthread
yetersiz olmasıdır.
-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. -lpthread
Başka tescilli seçenekler sunmazsanız veya bazı rastgele seçenekler sunmazsanız ne olacağı hiç umrumda değil . Yalnızca -lpthread
POSIX tarafından pthreads garanti etmek için belirtilmiştir ve bu gcc için yeterli görünmemektedir.
-pthread
Pthreads 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.
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 -lpthread
artık herhangi bir amaca hizmet etmiyor.
Derleyiciler gibi gcc
ve clang
(ve muhtemelen tüm Linux uyumlu derleyiciler) gerektirir kullanarak -pthread
hem 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, -pthread
seçenek Pthread API'nin talep edildiğini gösterir (birden fazla iş parçacığı API'si olabilir, örn. Solaris Threads) ve platforma özgü makroları ( _REENTRANT
Linux'ta , _MT
Solaris'te) tanımlar .
Bağlantı zamanında, -pthread
POSIX uyumlu Pthreads API davranışını uygulayan gerekli kitaplıklardaki (varsa) bağlantılar.
Yukarıdakiler, neden -lpthread
gerekli veya yeterli olmadığını açıkça ortaya koymaktadır .