Неопределенная ссылка на 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.
ephemient
Чуть выше этого примера вы увидите таблицу правильных команд компилятора, будь то GCC, IBM и т. Д. «Занятый русский» - это правильно.
Джонатон Рейнхарт
8
Не могли бы вы снять отметку с моего ответа, чтобы я мог удалить его (и отметить тот, который на самом деле является правильным, который является наиболее высоко оцененным)?
Павел Минаев
3
-lpthreadнужен во время компиляции
Как Чен
5
решениеLDFLAGS= -pthread -lpthread
dsnk

Ответы:

696

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

gcc -pthread -o term term.c

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

gcc -lpthread ...

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

Занятый русский
источник
2
+1 это решение сработало ... другого нет. Кроме того, предположение, что «библиотеки должны следовать источникам и объектам» - отличный совет - цитата или дальнейшее объяснение были бы хорошими.
sholsapp
7
@sholsapp Вот объяснение: webpages.charter.net/ppluzhnikov/linker.html
Занятый русский
Это все еще допустило ошибку для меня, пока я не поместил -lpthread в самый конец моей команды. gcc term.c -lpthread
CornSmith
Я только что столкнулся с проблемой компиляции snortsam в 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компиляции. Я был тогда в состоянии собрать snortsam. Спасибо занятым русским!
Дкаррит
5
Для тех, кто использует CODEBLOCKS: Добавить -pthreadв Параметры сборки проекта -> Настройки компоновщика -> Другие опции компоновщика.
user3728501
39

в затмении

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

Сэм
источник
Тот же совет применим в code :: 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.
Гопика Б.Г.
источник
Не рекомендуется использовать нестандартный флаг, когда существует стандартный флаг, который выполняет ту же функцию на вашей платформе.
Дэвид Шварц
16

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

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

введите описание изображения здесь

dylanninin
источник
12

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

add_compile_options(-pthread)

Или

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
Jayhello
источник
7

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

leesagacious
источник
6

Я считаю , что правильный способ добавления pthreadв CMakeэто со следующим

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)
Руфус
источник
4

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

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

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

WBuck
источник
3

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

Xiaolong
источник
7
неверная информация! -lpthreadэто не «опция», она указывает библиотеку.
опция командной строки (в отличие от аргумента командной строки)
Александр
3

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

Сэм
источник
2

проверьте страницу руководства, и вы получите.

Компилировать и связывать с -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, затем настройте проект. В окне «Настройка параметров» добавьте:

LDFLAGS='-lpthread'

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

naXa
источник
0

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

user1793997
источник