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