Неопределенная ссылка на pthread_create в Linux - PullRequest
329 голосов
/ 02 ноября 2009

Я взял следующую демоверсию из сети 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. Есть идеи, что не так?

Ответы [ 13 ]

612 голосов
/ 03 ноября 2009

Оба ответа на этот вопрос до сих пор неверны .
Для Linux правильная команда:

gcc -pthread -o term term.c

Как правило, библиотеки должны следовать источникам и объектам в командной строке, и -lpthread - это не «опция», это спецификация библиотеки. В системе с установленным libpthread.a,

gcc -lpthread ...

не сможет установить связь.

34 голосов
/ 22 октября 2012

в затмении

properties-> c / c ++ Build-> setting-> GCC C ++ linker-> библиотеки в верхней части добавляют "pthread"

14 голосов
/ 28 января 2014

На самом деле, он дает несколько примеров команд компиляции, используемых для кодов pthreads, перечисленных в таблице ниже, если вы продолжите читать следующий учебник:

https://computing.llnl.gov/tutorials/pthreads/#Compiling

enter image description here

11 голосов
/ 30 сентября 2018

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

gcc -o test test.c -pthread

Надеюсь, это кому-нибудь поможет!

6 голосов
/ 14 февраля 2017

Скомпилируйте это так: gcc demo.c -o demo -pthread

4 голосов
/ 16 апреля 2019

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

gcc -o term term.c -lpthread
  1. вы должны поместить -lpthread сразу после команды компиляции, эта команда скажет компилятору выполнить программу с библиотекой pthread.h.
  2. gcc -l связывается с файлом библиотеки. Ссылка -l с именем библиотеки без префикса lib.
4 голосов
/ 07 августа 2018

Если вы используете cmake, вы можете использовать:

add_compile_options(-pthread)

или

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
4 голосов
/ 12 марта 2012

Вам необходимо использовать опцию -lpthread с gcc.

3 голосов
/ 07 апреля 2012

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

0 голосов
/ 19 мая 2019

В Visual Studio 2019 укажите -pthread на страницах свойств проекта в:

Линкер -> Командная строка -> Дополнительные параметры

Введите -pthread в текстовое поле.

...