Linux'ta pthread_create'e tanımlanmamış referans


376

Aşağıdaki demoyu web'den https://computing.llnl.gov/tutorials/pthreads/ adresinden aldım.

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

Ancak makinemde derlediğimde (Ubuntu Linux 9.04 çalışıyor) aşağıdaki hatayı alıyorum:

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function main’:
term.c:23: warning: incompatible implicit declaration of built-in function exit
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

Bu benim için bir anlam ifade etmiyor, çünkü üstbilgi pthread.h, pthread_createişlevi olması gereken içeriyor . Neyin yanlış gittiğine dair bir fikrin var mı?


6
Ek olarak: platforma bağlı olarak, (a) dişler için farklı bir derleyiciye, (b) dişler için ( veya -lc_r), (c) -threadveya -threadsveya başka bir şey için farklı bir libc'ye ihtiyacınız olabilir -lpthread.
ephemient

Bu örneğin biraz üstünde, doğru derleyici komutlarının bir tablosunu göreceksiniz, ister GCC, IBM, isterse vb. 'Çalışan Rus' doğru olsun.
Jonathon Reinhart

8
Cevabımın işaretini kaldırabilir misiniz, böylece silebilirim (ve gerçekten doğru olanı işaretleyebilir miyim, hangisi en çok oy alan)?
Pavel Minaev

3
-lpthreadderleme sırasında gereklidir
Chen

5
çözümüLDFLAGS= -pthread -lpthread
dsnk

Yanıtlar:


696

Bu soruya şu ana kadar cevaplar yanlış .
Linux için doğru komut:

gcc -pthread -o term term.c

Genel olarak kütüphaneler, komut satırındaki kaynakları ve nesneleri izlemelidir ve -lpthreadbir "seçenek" değildir, bu bir kütüphane spesifikasyonudur. Yalnızca libpthread.akurulu bir sistemde ,

gcc -lpthread ...

bağlantı kuramaz.


2
+1 bu çözüm işe yaradı ... diğerleri işe yaramadı. Ayrıca, 'kütüphanelerin kaynakları ve nesneleri takip etmesi gerektiği' önerisi büyük tavsiyedir - bir alıntı veya daha fazla açıklama harika olurdu.
sholsapp


Komutumun sonuna -lpthread'i koyana kadar bu hala benim için hata yaptı. gcc term.c -lpthread
CornSmith

Ben sadece libuntth.a ve libpthread.so olan Ubuntu 14.04 üzerinde snortsam derleme bir sorunla karşılaştı. Ben başlamıştı undefined reference to 'pthread_cancel've undefined reference to 'pthread_create'hatalar. Bu SO yazısına rastladım ve Employed Russian'ın cevabını deneyeceğim diye düşündüm. makesnortsam.shVI'da açtım ve derleme yerine :%s/lpthread/pthread/gkullanmak için lpthread'i pthread ile değiştirme komutunu çalıştırdım . Daha sonra snortsam'ı derleyebildim. Teşekkürler Rus çalışıyor! -pthread-lpthread
dcarrith

5
CODEBLOCKS kullanan herkes için: -pthreadProje Oluşturma Seçeneklerine Ekle -> Bağlayıcı Ayarları -> Diğer bağlayıcı seçenekleri.
user3728501

39

güneş tutulması

properties-> c / c ++ Build-> setting-> GCC C ++ linker-> üst kısımdaki kütüphaneler "pthread" ekle


Aynı ipucu kodda geçerlidir :: proje (ve sanırım diğerleri de IDE)
Fil

19

Linux terminalinden çalıştığımda, benim için işe yarayan şu komutu kullanarak derlemeliydi (derlemek istediğim c dosyasının test.c olduğunu varsayalım):

gcc -o test test.c -pthread

Umarım birine yardım eder!


19

Linux için doğru komut:

gcc -o term term.c -lpthread
  1. derleme komutundan hemen sonra -lpthread komutunu koymanız gerekir, bu komut derleyiciye pthread.h kütüphanesi ile programı yürütmesini söyler.
  2. gcc -l bir kütüphane dosyasıyla bağlantı kurar. lib öneki olmadan kütüphane adına sahip -l bağlantısı.

Platformunuzda aynı işleve sahip standart bir bayrak bulunduğunda standart olmayan bir bayrak kullanmak iyi bir fikir değildir.
David Schwartz


12

Cmake kullanıyorsanız şunları kullanabilirsiniz:

add_compile_options(-pthread)

Veya

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")


6

Ben eklemenin uygun yolu inanıyoruz pthreadiçinde CMakeaşağıdaki ile olan

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

Visual Studio 2019'da -pthreadaşağıdaki proje için özellik sayfalarında belirtin :

Bağlayıcı -> Komut Satırı -> Ek Seçenekler

Yazın -pthreadmetin kutusuna.


3

Bu seçeneği -lpthreadgcc ile kullanmanız gerekir .


7
yanlış bilgi! -lpthreadbir "seçenek" değil, bir kitaplık belirtir.

bir komut satırı seçeneği (komut satırı bağımsız değişkeninin aksine)
Alexander Stohr

3

yalnızca proprieties => C / C ++ build => GCC C ++ Linker => Libraries => üst kısım "Libraries (-l)" içine "pthread" eklemeniz gerekir. bu kadar


2

adam sayfasını kontrol edin ve alacaksınız.

Derleme ve -pthread ile bağlantı.

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....

0

Anjuta'da, Yapı menüsüne ve ardından Projeyi Yapılandır'a gidin. Seçenekleri Yapılandır kutusuna aşağıdakileri ekleyin:

LDFLAGS='-lpthread'

Umarım birine de yardım eder ...


0

Bazen, birden çok kitaplık kullanıyorsanız kitaplık bağımlılığını kontrol edin. (örneğin -lpthread -lSDL ... <==> ... -lSDL -lpthread)

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.