Невизначена посилання на 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.