Çok iş parçacıklı programları derlerken kullanılan gcc -pthreadve arasındaki fark nedir gcc -lpthread?
Çok iş parçacıklı programları derlerken kullanılan gcc -pthreadve 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 -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 .
-lpthreadtü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.
-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.
-lpthreadolmamakla birlikte derlemenin -pthreadyetersiz 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. -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.
-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.
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 .