Ответ 1
Вероятно, вы забыли связать с библиотекой Pthreads (используя -lpthread
в командной строке).
Когда я попытался скомпилировать эту программу, она не удалась:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
void *WriteNumbers(void *threadArg)
{
int start, stop;
start = atoi((char *)threadArg);
stop = start + 10;
while (start < stop)
{
printf("%d\n", start++);
sleep(1);
}
return 0;
}
int main(int argc, char **argv)
{
pthread_t thread1, thread2;
// create the threads and start the printing
pthread_create(&thread1, NULL, WriteNumbers, (void *)argv[1] );
pthread_create(&thread2, NULL, WriteNumbers, (void *)argv[2]);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
Он дал мне следующие ошибки:
tmp/ccrW21s7.o: In function `main':
pthread.c:(.text+0x83): undefined reference to `pthread_create'
pthread.c:(.text+0xaa): undefined reference to `pthread_create'
pthread.c:(.text+0xbd): undefined reference to `pthread_join'
pthread.c:(.text+0xd0): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
Почему это дает мне эти справочные ошибки undefined, хотя я включил pthread.h
, который объявляет эти функции?
Вероятно, вы забыли связать с библиотекой Pthreads (используя -lpthread
в командной строке).
Другие упомянули, что вы не связаны с библиотекой pthread, используя флаг -lpthread
. Современный GCC (не уверен, насколько современный, мой 4.3.3) позволяет использовать только -pthread
. На странице man:
-pthread
Добавляет поддержку многопоточности с помощью библиотеки pthreads. Эта опция устанавливает флаги как для препроцессора, так и для компоновщика.
Вам нужно связать библиотеку pthread
с вашим двоичным файлом, например:
cc -o myapp myapp.c -lpthread
Do
gcc -pthread -o name filename.c (cpp)
чтобы скомпилировать программу, затем
./name
для запуска программы.
Для тех, кто ищет решение csapp. Сначала скомпилируйте csapp.c, затем
gcc -o filename filename.c csapp.o -lpthread