Почему я получаю ошибки «неопределенная ссылка», даже если я включаю правильные заголовочные файлы? - PullRequest
16 голосов
/ 08 ноября 2010

Когда я пытался скомпилировать эту программу, она не удалась:

#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

Почему он дает мне эти неопределенные ошибки ссылок, хотя я включил pthread.h, который объявляет эти функции?

Ответы [ 5 ]

25 голосов
/ 08 ноября 2010

Вы, вероятно, забыли связать с библиотекой Pthreads (используя -lpthread в командной строке).

21 голосов
/ 08 ноября 2010

Другие отметили, что вы не связались с библиотекой pthread с помощью флага -lpthread.Современный GCC (не уверен, насколько современный, мой 4.3.3) позволяет использовать только -pthread.Со страницы man:

-pthread
Добавлена ​​поддержка многопоточности с библиотекой pthreads.Эта опция устанавливает флаги для препроцессора и компоновщика.

3 голосов
/ 08 ноября 2010

Вам необходимо связать библиотеку pthread с вашим двоичным файлом, например:

cc -o myapp myapp.c -lpthread
2 голосов
/ 14 мая 2016

Do

gcc -pthread -o name filename.c (cpp)

для компиляции программы, затем

./name

для запуска программы.

0 голосов
/ 26 января 2019

Для тех, кто ищет решение csapp. Сначала скомпилируйте "csapp.c", затем

gcc -o filename filename.c csapp.o -lpthread
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...