Неопределенная ссылка на 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


Это все еще допустило ошибку для меня, пока я не поместил -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.

Не рекомендуется использовать нестандартный флаг, когда существует стандартный флаг, который выполняет ту же функцию на вашей платформе.
— Дэвид Шварц


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на страницах свойств проекта:

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

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


3

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


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'

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


0

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.