Referensi yang tidak terdefinisi ke pthread_create di Linux

376

Saya mengambil demo berikut dari web dari https://computing.llnl.gov/tutorials/pthreads/

#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);
}

Tetapi ketika saya mengkompilasinya di komputer saya (menjalankan Ubuntu Linux 9.04) saya mendapatkan kesalahan berikut:

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

Ini tidak masuk akal bagi saya, karena termasuk header pthread.h, yang seharusnya memiliki pthread_createfungsi. Ada ide apa yang salah?

Muntah
sumber
6
Selain itu: tergantung pada platform, Anda mungkin perlu (a) kompiler berbeda untuk utas, (b) libc berbeda untuk utas (yaitu -lc_r), (c) -threadatau -threadsatau lainnya, sebagai ganti atau sebagai tambahan -lpthread.
ephemient
Hanya sedikit di atas contoh itu, Anda akan melihat tabel perintah kompiler yang benar, apakah itu GCC, IBM, dll. 'Employed Russian' benar.
Jonathon Reinhart
8
Bisakah Anda tidak menandai jawaban saya, sehingga saya dapat menghapusnya (dan tandai jawaban yang benar, yang merupakan pilihan tertinggi)?
Pavel Minaev
3
-lpthreaddiperlukan saat kompilasi
How Chen
5
solusiLDFLAGS= -pthread -lpthread
dsnk

Jawaban:

696

Kedua jawaban untuk pertanyaan ini sejauh ini salah .
Untuk Linux perintah yang benar adalah:

gcc -pthread -o term term.c

Secara umum, perpustakaan harus mengikuti sumber dan objek pada baris perintah, dan -lpthreadbukan merupakan "opsi", ini adalah spesifikasi perpustakaan. Pada sistem dengan hanya libpthread.adiinstal,

gcc -lpthread ...

akan gagal ditautkan.

Mempekerjakan bahasa Rusia
sumber
2
+1 solusi ini berfungsi ... otheres tidak. Juga, saran bahwa 'perpustakaan harus mengikuti sumber dan benda' adalah saran yang bagus - kutipan atau penjelasan lebih lanjut akan bagus.
sholsapp
7
@sholsapp Berikut ini penjelasannya: webpages.charter.net/ppluzhnikov/linker.html
Dipekerjakan Rusia
Ini masih salah bagi saya sampai saya meletakkan -lpthread di akhir perintah saya. gcc term.c -lpthread
CornSmith
Saya baru saja mengalami masalah kompilasi snortsam di Ubuntu 14.04 yang sebenarnya memiliki libpthread.a dan libpthread.so. Saya mendapatkan undefined reference to 'pthread_cancel'dan undefined reference to 'pthread_create'kesalahan. Saya menemukan posting SO ini dan berpikir saya akan mencoba jawaban Mempekerjakan Rusia. Saya membuka makesnortsam.shdi VI dan menjalankan perintah :%s/lpthread/pthread/guntuk mengganti lpthread dengan pthread sehingga akan digunakan -pthreadalih-alih -lpthreadsaat dikompilasi. Saya kemudian dapat menyusun snortsam. Terima kasih dipekerjakan bahasa Rusia!
dcarrith
5
Bagi siapa pun yang menggunakan CODEBLOCKS: Tambahkan -pthreadke Opsi Project Build -> Pengaturan Linker -> Opsi linker lainnya.
user3728501
39

dalam gerhana

properties-> c / c ++ Build-> setting-> GCC C ++ linker-> library di bagian atas tambahkan "pthread"

sam
sumber
Tip yang sama berlaku dalam kode :: proyek (dan saya pikir orang lain juga IDE)
Fil
19

Berjalan dari terminal Linux, apa yang berhasil bagi saya adalah kompilasi menggunakan perintah berikut (misalkan file c yang ingin saya kompilasi disebut test.c):

gcc -o test test.c -pthread

Semoga ini bisa membantu seseorang!

Alexander Nenartovich
sumber
19

Untuk Linux perintah yang benar adalah:

gcc -o term term.c -lpthread
  1. Anda harus meletakkan -lpthread tepat setelah perintah kompilasi, perintah ini akan memberi tahu kompiler untuk menjalankan program dengan pthread.h library.
  2. gcc -l tautan dengan file perpustakaan.Link -l dengan nama perpustakaan tanpa awalan lib.
Gopika BG
sumber
Ini bukan ide yang baik untuk menggunakan bendera non-standar ketika ada bendera standar yang memiliki fungsi yang sama pada platform Anda.
David Schwartz
12

Jika Anda menggunakan cmake, Anda dapat menggunakan:

add_compile_options(-pthread)

Atau

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
Jayhello
sumber
7

Kompilasi seperti ini: gcc demo.c -o demo -pthread

leesagacious
sumber
6

Saya percaya cara yang tepat untuk menambahkan pthreaddi CMakeadalah dengan berikut ini

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
Rufus
sumber
4

Dalam Visual Studio 2019 tentukan -pthreaddi halaman properti untuk proyek di bawah:

Linker -> Command Line -> Opsi Tambahan

Ketikkan di -pthreadkotak teks.

WBuck
sumber
3

Anda perlu menggunakan opsi -lpthreaddengan gcc.

Xiaolong
sumber
7
informasi yang salah! -lpthreadbukan "opsi", ini menentukan perpustakaan.
opsi baris perintah (berbeda dengan argumen baris perintah)
Alexander Stohr
3

Anda hanya perlu menambahkan "pthread" di proprieties => C / C ++ build => GCC C ++ Linker => Libraries => bagian atas "Libraries (-l)". itu dia

sam
sumber
2

periksa halaman manual dan Anda akan mendapatkannya.

Kompilasi dan tautkan dengan -pthread.

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.
       ....
kalu Wang
sumber
0

Di Anjuta, buka menu Bangun, lalu Konfigurasikan Proyek. Di kotak Opsi Konfigurasi, tambahkan:

LDFLAGS='-lpthread'

Semoga itu akan membantu seseorang juga ...

naXa
sumber
0

Terkadang, jika Anda menggunakan beberapa pustaka, periksa ketergantungan pustaka. (mis. -lpthread -lSDL ... <==> ... -lSDL -lpthread)

pengguna1793997
sumber