Неразрешенный внешний символ в объектных файлах

Во время кодирования в Visual Studio я получил нерешенную ошибку внешнего символа и я понятия не имею, что делать. Я не знаю, что случилось. Не могли бы вы, пожалуйста, расшифровать меня? Где я должен искать, какие ошибки?

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" ([email protected]@@[email protected]@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z)
1>Form.obj : error LNK2019: unresolved external symbol "public: virtual void __thiscall Field::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" ([email protected]@[email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" ([email protected]@@UAEXXZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getName(void)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Field::getType(void)" ([email protected]@@[email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" ([email protected]@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

Ответ 1

Эта ошибка часто означает, что какая-то функция имеет объявление, но не определение.

Пример:

// A.hpp
class A
{
public:
  void myFunc(); // Function declaration
};

// A.cpp

// Function definition
void A::myFunc()
{
  // do stuff
}

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

  • не определяют функции в вашем файле cpp (если вы сами написали этот код)
  • не включают файл lib/dll, содержащий определения

Общей ошибкой является то, что вы определяете функцию как автономную и забываете селектор классов, например. A::, в вашем .cpp файле:

Неверно: void myFunc() { /* do stuff */ }
Вправо: void A::myFunc() { /* do stuff */ }

Ответ 2

Убедитесь, что вы включили все исходные файлы в свое решение, на которое вы ссылаетесь.

Если вы не включаете исходный файл (и, следовательно, реализацию) для класса Field в свой проект, он не будет создан, и вы не сможете связать его во время компиляции.

В качестве альтернативы, возможно, вы используете статическую или динамическую библиотеку и забыли рассказать компоновщику о .lib s?

Ответ 3

Похоже, что отсутствует библиотека или включить ее, вы можете попытаться выяснить, какой класс вашей библиотеки имеет getName, getType и т.д.... и поместить это в файл заголовка или используя #include.

Также, если это происходит из внешней библиотеки, убедитесь, что вы ссылаетесь на них в файле проекта. Например, если этот класс принадлежит abc.lib, то в вашей Visual Studio

  • Нажмите "Свойства проекта".
  • Перейдите в Свойства конфигурации, C/С++, Сгенерируйте, убедитесь, что вы указываете местоположение abc.lib в разделе Дополнительно Включить каталоги. Под Linker, Input, убедитесь, что у вас есть abc.lib в разделе Дополнительные зависимости.

Ответ 4

Я только что видел проблему, которую не могу вызвать функцию из main в .cpp файле, правильно объявленную в файле .h и указанную в .c файле. Обнаружена ошибка компоновщика. Между тем я могу вызвать функцию из обычного .c файла. Возможно, это зависит от соглашения о вызовах. Решение заключалось в том, чтобы добавить следующие строки preproc в каждый файл .h:

#ifdef __cplusplus
extern "C"
{
#endif

и в конце концов

#ifdef __cplusplus
}
#endif

Ответ 5

У меня была ошибка, когда мой проект был скомпилирован как проект x64. и я использовал Библиотека, которая была скомпилирована как x86.

Я перекомпилировал библиотеку как x64 и решил ее.

Ответ 6

В дополнение к отличному ответу Криса Морриса выше, я нашел очень интересный способ получить эту же ошибку, если вы вызываете виртуальный метод, который не был установлен в чистом виде, но не имеет собственной реализации. Это та же самая причина (компилятор не может найти реализацию метода и, следовательно, мошенников), но моя IDE не заметила эту ошибку в наименьшем бите.

например, следующий код получит ошибку компиляции с тем же сообщением об ошибке:

//code testing an interface
class test
{
   void myFunc(); 
}

//define an interface
class IamInterface
{
    virtual void myFunc();
}

//implementation of the interface
class IamConcreteImpl
{
    void myFunc()
    {
       1+1=2;
    }
}

Однако, изменяя IamInterface myFunc() как чистый виртуальный метод (метод, который должен быть реализован, чем виртуальный метод, который является методом, который может быть переопределен) устраняет ошибку компиляции.

//define an interface
class IamInterface
{
    virtual void myFunc() = 0;
}

Надеемся, что это поможет следующему пользователю StackOverFlow пройти код!

Ответ 7

Я считаю, что большинство вопросов, касающихся причин и средств защиты, были охвачены всеми участниками этой темы. Я просто хочу указать на мою "нерешенную внешнюю" проблему, она была вызвана типом данных, определяемым как макрос, который заменяется иначе, чем ожидалось, что приводит к тому, что неправильный тип предоставляется данной функции, а так как функция с типом никогда не было определено, оно не могло быть разрешено. В частности, в разделе C/С++ → Language есть атрибут "Обработать WChar_t As Built in Type", который должен был быть определен как "Нет (/Zc: wchar_t-)", но в моем случае этого не произошло.

Ответ 8

иногда, если новый заголовочный файл добавляется, и эта ошибка начинается из-за этого, вам также нужно добавить библиотеку, чтобы избавиться от unresolved external symbol.

например:

#include WtsApi32.h

потребуется:

#pragma comment(lib, "Wtsapi32.lib") 

Ответ 9

У меня были те же ошибки ссылок, но из тестового проекта, который ссылался на другую DLL. Выяснилось, что после добавления _declspec(dllexport) перед каждой функцией, указанной в сообщении об ошибке, ссылка работала хорошо.

Ответ 10

Я делаю С++ впервые за долгое время, и я получаю эту ошибку, когда забываю добавить префикс ClassName:: для определения функции, так как это немного уникально для С++. Поэтому не забудьте проверить это тоже!

Ответ 11

См. Ошибка Linker Tools LNK2019 в MSDN, в нем есть подробный список распространенных проблем, вызывающих LNK2019.

Ответ 12

Убедитесь, что вы украшаете файлы заголовков

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

Плохие вещи, включая это, могут произойти, если вы не

Ответ 13

Одной из возможных причин этой ошибки компоновщика также могут быть inline функции, объявленные, но не определенные в заголовочном файле, который затем включается в другое место. Встроенные функции должны быть определены в каждой единицы перевода, в которой они используются.

Ответ 14

Мне просто нелегко было с этим. Все было логически настроено. Я объявил конструктор, но не определил его

class SomeClass
{
   SomeClass();  // needs the SomeClass::SomeClass(){} function defined somewhere, even here
}

Я чуть не ударился головой о клавиатуру, когда забыл что-то такое элементарное.

Ответ 15

УКАЗАТЕЛИ

У меня была эта проблема и она была решена с помощью указателя. Я вижу, что это не ваша проблема, но я подумал, что упомянул об этом, потому что я действительно хотел, чтобы это было здесь, когда я увидел это час назад. Моя проблема состояла в том, чтобы объявить статическую переменную-член без ее определения (определение должно появиться после некоторых других настроек), и, конечно, указатель не нуждается в определении. Не менее элементарная ошибка: P

Ответ 16

Моя проблема заключалась в том, что в sconscript не указан файл cpp. Это может быть очень запутанным, потому что Visual Studio имеет файл cpp в проекте, но что-то еще полностью создает.

Ответ 17

Моя проблема: я должен был сделать forward declare класса, чей ctor был "неразрешенным внешним".

В файле, где я получил ошибку, мне пришлось добавить что-то вроде этого:

#include "ClassB" 

class ClassB; // this solved the problem

class ClassA{
    void foo(){
        ClassB* tmp = new ClassB();
        // ...
    }
};

Конечно, мой проект намного сложнее, и это всего лишь пример фрагмента. Также при использовании пространств имен объявить их также.

Ответ 18

Просто потратил пару часов, чтобы узнать, что проблема связана с моим основным файлом с расширением .c вместо .cpp

:/

Ответ 19

проверьте, что ваша целевая платформа проекта VS совместима с загруженными вами бинарниками.

Например: Платформа: Win32 ---- VS2013 32 бита 6.3 (статические)

Ответ 20

Еще одна возможность проверить, это была моя проблема на этот раз.

Я добавил функцию в библиотеку и включил папку вывода библиотеки в путь поиска.

Но у меня также была папка с более ранней версией библиотеки, указанной ранее, поэтому VS использовал старую библиотеку и, конечно, не нашел новую функцию.

Ответ 21

Убедитесь, что вы не пытаетесь перегрузить операторы вставки или извлечения как встроенные функции. У меня была эта проблема, и она ушла, когда я удалил это ключевое слово.

Ответ 22

Еще одна возможная проблема (я несколько раз почесал голову):

Если вы определяете свои функции как inline, они, конечно! - должны быть определены в заголовке (или встроенном файле), а не в cpp.
В моем случае они были в встроенном файле, но только потому, что они были реализацией на платформе, а cpp включали этот соответствующий inl файл... вместо заголовка. Да, это так.

Я думал, что тоже останусь здесь, возможно, кто-то еще столкнется с той же проблемой и найдет его здесь.