Описание тега unresolved-external

По вопросам о коде, который компилируется, но не ссылается из-за неразрешенных внешних символов. Важно, чтобы вопросы включали полную команду компоновщика, а также минимальную программу, которая ссылается на рассматриваемое имя.

"Неразрешенный внешний символ" - это ошибка компоновщика. Часто это означает, что у некоторой функции есть объявление, но нет определения.

Распространенной причиной этой ошибки является компиляция кода с использованием заголовков библиотеки, но невозможность связывания с кодом этой библиотеки: отсутствие библиотеки в команде связывания или выбор другой версии библиотеки.

Существует FAQ: что такое ошибка неопределенного эталона / неразрешенного внешнего символа и как ее исправить?. Если в вашем вопросе отсутствует полная команда компоновщика и нет доказательств того, что вы прочитали эти ответы, не удивляйтесь, если вы будете перенаправлены туда.


Как написать хороший вопрос

  • Создайте простейшую воспроизводимую программу, чтобы продемонстрировать проблему. Простой способ сделать это в C - взять адрес символа и использовать его:

    #include <pthread.h>
    
    int main()
    {
        int (*a)(pthread_t) = pthread_detach;
        return !a;
    }
    
  • Покажите команду, используемую для связывания программы, и ее вывод:

    gcc -std=c11 -fPIC unresolved-external.c -o unresolved-external
    
    /tmp/user/1432/ccI38tid.o: In function `main':
    unresolved-external.c:5: undefined reference to `pthread_detach'
    collect2: error: ld returned 1 exit status