Неопределенная ссылка на pthread_create в Linux

264

Я взял следующую демонстрацию из Интернета из 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 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. Любые идеи, что происходит не так?

  • 5
    Дополнительно: в зависимости от платформы вам может понадобиться (а) другой компилятор для потоков, (б) другой libc для потоков (т.е. -lc_r ), (c) -thread или -threads или другие, вместо или в дополнение к -lpthread
  • 0
    Чуть выше этого примера вы увидите таблицу правильных команд компилятора, будь то GCC, IBM и т. Д. «Employed Russian» - это правильно.
Показать ещё 4 комментария
Теги:
multithreading
pthreads

10 ответов

582

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

gcc -pthread -o term term.c

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

gcc -lpthread ...

не будет связываться.

  • 2
    +1 это решение сработало ... другого нет. Кроме того, предположение, что «библиотеки должны следовать источникам и объектам» - отличный совет - цитата или дальнейшие объяснения были бы хорошими.
  • 7
    @sholsapp Вот объяснение: webpages.charter.net/ppluzhnikov/linker.html
Показать ещё 5 комментариев
70

Для использования Linux:

gcc -pthread -o term term.c

-pthread сообщает компилятору ссылку в библиотеке pthread, а также настраивать компиляцию для потоков.

Использование параметра -lpthread только связывает библиотеку pthread - предопределенные макросы не определяются.

В нижней строке: вы должны использовать опцию -pthread.

29

в eclipse

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

  • 0
    Тот же совет применим в code :: project (и я думаю, что другие IDE тоже)
15

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

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

Изображение 4802

5

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

3

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

  • 1
    Спасибо, это работает, я использую кодовые блоки в CentOS, Перейти в Настройки -> Компилятор ... -> Настройки компоновщика. А затем добавить «pthread» в библиотеки ссылок
3

Вам нужно использовать опцию -lpthread с gcc.

  • 1
    -pthread также работает с gcc
  • 5
    неверная информация! -lpthread не является «опцией», она определяет библиотеку.
0

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

add_compile_options(-pthread)

Или

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

Иногда, если вы используете несколько библиотек, проверьте зависимость библиотеки. (например, -lpthread -lSDL... < == > ... -lSDL -lpthread)

0

В Anjuta перейдите в меню Build, затем Configure Project. В окне "Настройка параметров" добавьте:

LDFLAGS='-lpthread'

Надеюсь, что это тоже поможет кому-то...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню