Неразрешенный внешний символ в объектных файлах - PullRequest
163 голосов
/ 29 марта 2012

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

1>Form.obj : error LNK2019: unresolved external symbol "public: class Field * __thiscall Field::addField(class Field *)" (?addField@Field@@QAEPAV1@PAV1@@Z) referenced in function "public: void __thiscall Form::parse(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?parse@Form@@QAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@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> > &)" (?parse@Field@@UAEXAAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) referenced in function "public: __thiscall InputField::InputField(class std::basic_stringstream<char,struct std::char_traits<char>,class std::allocator<char> > &)" (??0InputField@@QAE@AAV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::prompt(void)" (?prompt@Field@@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)" (?getName@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@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)" (?getType@Field@@UAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ)
1>Form.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall Field::describe(void)" (?describe@Field@@UAEXXZ)
1>C:\Users\tomy\Documents\Visual Studio 2010\Projects\zapoctovkac++\Debug\zapoctovkac++.exe : fatal error LNK1120: 6 unresolved externals

Ответы [ 22 ]

1 голос
/ 18 января 2015

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

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

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

1 голос
/ 26 января 2017

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

1 голос
/ 24 февраля 2015

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

1 голос
/ 12 июня 2015

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

0 голосов
/ 17 октября 2017

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

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

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

0 голосов
/ 13 марта 2017

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

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

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

0 голосов
/ 16 июля 2016

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

:/

0 голосов
/ 27 мая 2016

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

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

#include "ClassB" 

class ClassB; // this solved the problem

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

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

0 голосов
/ 07 мая 2015

УКАЗАТЕЛИ

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

0 голосов
/ 17 ноября 2017

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

...