Невизначена посилання на pthread_create в Linux


376

Я взяв таку демонстраційну версію в Інтернеті з 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);
}

Але коли я компілюю його на своїй машині (під керуванням Ubuntu Linux 9.04), я отримую таку помилку:

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

Це не має для мене ніякого сенсу, тому що в заголовку входить pthread.h, який повинен мати pthread_createфункцію. Будь-які ідеї, що йде не так?


6
Додатково: в залежності від платформи, вам може знадобитися (а) іншої компілятор для потоків, (б) різні LibC для потоків (тобто -lc_r), (с) -threadабо -threadsчи інший, замість або на додаток до -lpthread.
— ефемія

Трохи вище цього прикладу ви побачите таблицю правильних команд компілятора, будь то GCC, IBM та ін.
— Джонатан Райнхарт

8
Чи можете ви, будь ласка, відмітити мою відповідь, щоб я міг її видалити (і позначити ту, яка насправді є правильною, а саме - голосовою)?
— Павло Мінаєв

3
-lpthreadпотрібен під час компіляції
— How Chen

5
рішенняLDFLAGS= -pthread -lpthread
— dsnk

Відповіді:


696

Обидві відповіді на це питання поки що невірні .
Для Linux правильна команда:

gcc -pthread -o term term.c

Взагалі бібліотеки повинні слідувати за джерелами та об'єктами в командному рядку, і -lpthreadце не "параметр", це специфікація бібліотеки. У системі, яка лише libpthread.aвстановлена,

gcc -lpthread ...

не вдасться зв’язатись.


2
+1 це рішення спрацювало ... інших не було. Крім того, пропозиція про те, що "бібліотеки повинні слідкувати за джерелами та об'єктами" є чудовою порадою - цитування чи подальше пояснення було б чудово.
— sholsapp


Це все ще помиляється для мене, поки я не поставив -lpthread в самому кінці своєї команди. gcc term.c -lpthread
— CornSmith

Я щойно зіткнувся з проблемою, що компілює снорцам на Ubuntu 14.04, яка насправді має і libpthread.a, і libpthread.so. Я отримував undefined reference to 'pthread_cancel'і undefined reference to 'pthread_create'помилки. Я натрапив на цю посаду ТА і подумав, що спробую відповісти Російською мовою. Я відкрив makesnortsam.shу VI і запустив команду :%s/lpthread/pthread/gзамінити lpthread на pthread, щоб вона використовувалась -pthreadзамість -lpthreadпри компілюванні. Тоді я зміг скласти снорцам. Дякую працевлаштованому російському!
— dcarrith

5
Для всіх, хто використовує CODEBLOCKS: Додайте -pthreadпараметри збірки проекту -> Налаштування Linker -> Інші параметри лінкера.
— користувач3728501

39

у затемненні

властивості-> c / c ++ збірка-> налаштування-> GCC C ++ linker-> бібліотеки у верхній частині додають "pthread"


Ця ж порада стосується коду :: project (і я думаю, що інші IDE теж)
— Fil

19

Запускаючи з терміналу Linux, для мене працювало компілювання за допомогою наступної команди (припустимо, файл c, який я хочу скласти, називається test.c):

gcc -o test test.c -pthread

Сподіваюся, це комусь допоможе!


19

Для Linux правильна команда:

gcc -o term term.c -lpthread
  1. ви повинні поставити -lpthread відразу після команди компіляції, ця команда скаже компілятору виконати програму з бібліотекою pthread.h.
  2. gcc -l посилання на файл бібліотеки. Посилання -l з назвою бібліотеки без префікса lib.

Недоцільно використовувати нестандартний прапор, коли існує стандартний прапор, який має ту саму функцію на вашій платформі.
— Девід Шварц


12

Якщо ви використовуєте cmake, ви можете використовувати:

add_compile_options(-pthread)

Або

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


6

Я вважаю , що правильний спосіб додавання pthreadв CMakeце з наступним

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

У Visual Studio 2019 вкажіть -pthreadна сторінках властивостей проекту під:

Linker -> Command Line -> Additional Options

Введіть у -pthreadтекстове поле.


3

Потрібно використовувати опцію -lpthreadз gcc.


7
неправильна інформація! -lpthreadне є "опцією", вона вказує бібліотеку.

варіант командного рядка (на відміну від аргументу командного рядка)
— Олександр Стор

3

вам потрібно лише додати "pthread" у власність => C / C ++ build => GCC C ++ Linker => Бібліотеки => верхня частина "Бібліотеки (-l)". Це воно


2

перевірити сторінку man, і ви отримаєте.

Складіть і зв’яжіть з -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.
       ....

0

У Anjuta перейдіть до меню Build, а потім Configure Project. У полі Налаштування параметрів додайте:

LDFLAGS='-lpthread'

Сподіваюся, це теж допоможе комусь ...


0

Іноді, якщо ви використовуєте кілька бібліотек, перевірте залежність бібліотеки. (наприклад, -lpthread -lSDL ... <==> ... -lSDL -lpthread)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.