Неразрешенный внешний символ в объектных файлах - 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 ]

282 голосов
/ 29 марта 2012

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

Пример:

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

// A.cpp

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

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

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

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

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

23 голосов
/ 29 марта 2012

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

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

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

11 голосов
/ 29 марта 2012

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

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

  1. щелкните Свойства проекта.
  2. Перейдите в Свойства конфигурации, C / C ++, Создать, убедитесь, что вы указываете на местоположение abc.lib в разделе Дополнительные каталоги включения.Под Linker, Input, убедитесь, что у вас есть abc.lib в разделе Дополнительные зависимости.
6 голосов
/ 06 февраля 2017

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

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

6 голосов
/ 14 сентября 2015

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

#ifdef __cplusplus
extern "C"
{
#endif

и это в конце

#ifdef __cplusplus
}
#endif
4 голосов
/ 08 октября 2016

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

3 голосов
/ 18 ноября 2015

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

3 голосов
/ 21 июня 2016

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

например:

#include WtsApi32.h

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

#pragma comment(lib, "Wtsapi32.lib") 
2 голосов
/ 11 мая 2015

В дополнение к превосходному ответу Криса Морриса, приведенному выше, я обнаружил очень интересный способ получения этой же ошибки, если вы вызываете виртуальный метод, который не был установлен в чистый, но не имеет собственной реализации.Это та же самая причина (компилятор не может найти реализацию метода и, следовательно, мошенников), но моя 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 () на чистый виртуальный метод (метод, который «должен» быть реализован), чем виртуальный метод, который является методом«can» может быть переопределено) устранит ошибку компиляции.

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

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

2 голосов
/ 25 июня 2015

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

#ifndef YOUR_HEADER_H
#define YOUR_HEADER_H

// your header code here

#endif

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

...