Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ошибка ссылка на неразрешенный внешний символ

Error LNK2019: ссылка на неразрешенный внешний символ

Попытался скомпилировать программу из книги (DerectX — это просто. Программируем графику на С++) в Visual C++ 2010 Express, получил ошибки компиляции.

1>—— Построение начато: проект: DX10Text, Конфигурация: Debug Win32 ——
1> main.cpp
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ _D3DX10CreateFontW@48 в функции «long __cdecl InitDirect3D10(void)» (?InitDirect3D10@@YAJXZ)
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ _D3D10CreateDeviceAndSwapChain@32 в функции «long __cdecl InitDirect3D10(void)» (?InitDirect3D10@@YAJXZ)
1>C:ПрогиПроги на C++DrectX 10Glava4TextDebugDX10Text.exe : fatal error LNK1120: 2 неразрешенных внешних элементов
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Если понадобится, тогда вот код

15.07.2012, 16:53

Error LNK2019: ссылка на неразрешенный внешний символ
Сразу скажу, что гуглил проблему. Но все решения то не подходили, то не работали. Поэтому и создал.

LNK2019 ссылка на неразрешенный внешний символ main
Попытался скомпилировать программу в Visual Studio 2015 , получил ошибки компиляции. Вот вывод.

error LNK2019: ссылка на неразрешенный внешний символ.
Подскажите что я не правельно сделал? #include using namespace std;.

Error LNK2019: ссылка на неразрешенный внешний символ
Всем доброго времени суток. Помогите пожалуйста разобраться с проблемой. Честно просматривал форму.

15.07.2012, 21:272

Решение

В визуал студии в левом окошке правой кнопкой мышки по проекту — Add New Item (добавить) — > существующий элемент (existens item) и ищи папку с установленным DirectX SDK и в ней находишь папку Libs (библиотеки) (обычно C:Program Files (x86)Microsoft DirectX SDK (June 2010)Libx64 и выбираешь d3d11.lib Но собственно тут завист всё от того, под какую версию директы ты программу пишешь. Короче говоря, ошибки линковщика (сборщика, он же Linker — тоесть та штука, которая идёт в окне вывода после компиляции при нажатии кнопки F7) — это в основном поиск не известных внешних исмволов, в твоём случае по крайней мере, и для решения проблемы, тебе следует в проект подключать те или иные библиотеки — тоесть lib файлы. Надеюсь я понятно объяснил

Добавлено через 7 минут
Для общего развития напишу: когда ты подключаешь H файлы директ икса, ну например d3d11.h и тд — в них идут только заголовки функций, тоесть название функции, тип вызова параметров (stdcall к примеру), класс памяти и тд, но самого кода (тоесть тела) функции там нет и чтоб линковщик мог в код твоей прграммы подставить текст самой функции — ему собственно и надо знать, как она выглядит. Тоесть тут есть варианты, либо ты подключаешь статическую библиотеку типа LIB, либо динамическую типа DLL либо пишешь сам классы собственного директ икса и подклюбсаешь файлы типа moydirectx.h и соответствующий cpp файл в свой прект :-)))

Что такое неопределенная ссылка / неразрешенная ошибка внешнего символа и как ее исправить?

Что такое неопределенные ссылки / неразрешенные ошибки внешнего символа? Каковы общие причины и как их устранить/предотвратить?

не стесняйтесь редактировать/добавлять свои собственные.

29 ответов

компиляция программы на C++ происходит в несколько этапов, как указано 2.2 (кредиты Киту Томпсону для справки):

приоритет среди синтаксических правил перевода определяется следующими этапами [см. сноску].

  1. физические символы исходного файла сопоставляются, определенным способом реализации, с базовым набором исходных символов (вводя новую строку символы для индикаторов конца строки), если необходимый. [SNIP]
  2. каждый экземпляр символа обратной косой черты ( ), за которым немедленно следует символ новой строки, удаляется, соединяя физические исходные строки с формируйте логические исходные строки. [SNIP]
  3. исходный файл разлагается на токены предварительной обработки (2.5) и последовательности пробелов (включая комментарии). [SNIP]
  4. предобработки выполняются директивы, расширяются вызовы макросов и выполняются выражения унарных операторов _Pragma. [SNIP]
  5. каждый исходный элемент набора символов в символьном литерале или строковом литерале, а также каждая escape-последовательность и универсальное символьное имя в символьном литерале или не-необработанном строковом литерале преобразуется в соответствующий член набора символов выполнения;[SNIP]
  6. смежный строковый литерал токены объединяются.
  7. символы пробела, разделяющие маркеры, больше не имеют значения. Каждый токен предварительной обработки преобразуется в токен. (2.7). Этот полученные токены синтаксически и семантически анализируются и переводится как единица перевода. [SNIP]
  8. переведенные единицы перевода и единицы создания экземпляров объединяются следующим образом:[SNIP]
  9. все внешние ссылки на сущности решенный. Компоненты библиотеки связаны для удовлетворения внешних ссылок на объекты, не определенные в текущий перевод. Все такие выходные данные переводчика собираются в a изображение программы, содержащее информацию, необходимую для выполнения в среда выполнения. (выделено мной)
Читать еще:  Ошибка open registry error

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

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

скажем, вы определили символ a на a.cpp . Теперь, b.cpp объявил этот символ и использовали его. Перед связыванием он просто предполагает, что этот символ был определен где-то, но ему все равно, где. Фаза связывания отвечает за поиск символа и его правильное связывание с b.cpp (ну, на самом деле к объекту или библиотеке, которая его использует).

если вы используете Microsoft Visual Studio, вы увидите, что проекты генерируют .lib файлы. Они содержат таблицу экспортированных символов и таблицу импортированных символов. Импортированные символы решаются против библиотеки линковать, и экспортируемые символы предоставлено для библиотек, которые используют это .lib (если таковые имеются).

аналогичные механизмы существуют для других компиляторов / платформ.

общие сообщения об ошибках error LNK2001 , error LNK1120 , error LNK2019 на Microsoft Visual Studio и undefined reference to symbolName на GCC.

будет генерировать следующие ошибки с GCC:

и подобные ошибки с Microsoft Visual Studio:

Что такое неопределенная ссылка / неразрешенная ошибка внешнего символа и как ее исправить?

Что такое неопределенная ссылка / неразрешенные ошибки внешнего символа? Каковы общие причины и как их устранить/предотвратить?

Не стесняйтесь редактировать / добавлять свои собственные.

25 Ответов

Компиляция программы C++ происходит в несколько этапов, как указано в 2.2 (кредиты Киту Томпсону для справки) :

Приоритет среди синтаксических правил перевода определяется следующими этапами [см. сноску].

  1. Физические символы исходного файла сопоставляются, определяемым реализацией образом, с базовым исходным набором символов (введение символов новой строки для индикаторов end-of-line) если необходимый. [SNIP]
  2. Каждый экземпляр символа обратной косой черты ( ), за которым сразу же следует символ новой строки, удаляется, соединяя физические исходные строки с формируйте логические исходные строки. [SNIP]
  3. Исходный файл декомпозируется на токены предварительной обработки (2.5) и последовательности пробелов (включая комментарии). [SNIP]
  4. Выполняются директивы предварительной обработки, расширяются вызовы макросов и выполняются выражения унарных операторов _Pragma. [SNIP]
  5. Каждый элемент исходного набора символов в символьном литерале или строковом литерале, а также каждая escape-последовательность и universal-character-name в символьном литерале или необработанном строковом литерале преобразуется в соответствующий член набора символов выполнения; [SNIP]
  6. Соседние строковые литеральные маркеры объединяются.
  7. Символы пробела, разделяющие маркеры, больше не имеют значения. Каждый токен предварительной обработки преобразуется в токен. (48). То полученные лексемы подвергаются синтаксическому и семантическому анализу и переводится как единица перевода. [SNIP]
  8. Переведенные единицы перевода и единицы создания экземпляров объединяются следующим образом: [SNIP]
  9. Все внешние ссылки на сущности разрешаются. Компоненты библиотеки связаны для удовлетворения внешних ссылок на сущности, не определенные в текущий перевод. Все такие выходные данные транслятора собираются в образ программы, который содержит информацию, необходимую для выполнения в своем среда выполнения. (Курсив мой)

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

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

Допустим, вы определили символ a в a.cpp . Итак, b.cpp объявил этот символ и использовал его. Перед связыванием он просто предполагает , что этот символ был определен где-то, но ему все равно, где именно. Фаза связывания отвечает за поиск символа и правильное связывание его с b.cpp (ну, фактически с объектом или библиотекой, которая его использует).

Если вы используете Microsoft Visual Studio, вы увидите, что проекты генерируют файлы .lib . Они содержат таблицу экспортированных символов и таблицу импортированных символов. Импортированные символы разрешаются для библиотек, на которые вы ссылаетесь, а экспортированные символы предоставляются для библиотек, использующих этот .lib (если таковые имеются).

Аналогичные механизмы существуют и для других платформ compilers/.

Распространенными сообщениями об ошибках являются error LNK2001 , error LNK1120 , error LNK2019 для Microsoft Visual Studio и undefined reference to symbolName для GCC .

будет генерировать следующие ошибки с GCC :

и подобные ошибки с Microsoft Visual Studio :

Как решить ошибку LNK2019: неразрешенный внешний символ-функция?

я получаю эту ошибку, но я не знаю как это исправить.

я использую Visual Studio 2013. Я сделал имя решения MyProjectTest Это структура моего тестового решения:

10 ответов:

одним из вариантов было бы включить function.cpp в своем UnitTest1 проект, но это может быть не самая идеальная структура решения. Короткий ответ на вашу проблему заключается в том, что при создании вашего UnitTest1 проект, компилятор и компоновщик понятия не имеют, что function.cpp существует, а также не имеют ничего, чтобы связать, что содержит определение multiple . Способ исправить это-использовать библиотеки ссылок.

поскольку ваши модульные тесты находятся в другом проекте, я предполагаю, что ваше намерение состоит в том, чтобы сделайте этот проект автономной программой модульного тестирования. С функциями, которые вы тестируете, расположенными в другом проекте, можно построить этот проект в динамически или статически связанной библиотеке. Статические библиотеки связаны с другими программами во время сборки, и имеют расширение .lib , и динамические библиотеки связаны во время выполнения, и имеют расширение .dll . Для моего ответа я предпочитаю статические библиотеки.

вы можете превратить свою первую программу в статическую библиотеку изменив его в свойствах проектов. Там должна быть опция на вкладке Общие, где проект настроен на сборку в исполняемый файл ( .exe ). Вы можете изменить это на .lib . Элемент .lib файл будет построен в том же месте, что и .exe .

в своем UnitTest1 проект, вы можете перейти к его свойствам, и на вкладке Компоновщик в категории дополнительные каталоги библиотеки, добавить путь к которому MyProjectTest строит. Затем, для получения дополнительных зависимостей под Компоновщик — Вкладка ввода, добавьте имя вашей статической библиотеки, скорее всего MyProjectTest.lib .

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

в дереве решений Visual Studio щелкните правой кнопкой мыши на проекте «UnitTest1», затем добавьте -> существующий элемент -> выберите файл ../MyProjectTest / функция.cpp

Так как я хочу, чтобы мой проект компилировался в автономный EXE, я связал UnitTest проект с функцией.obj файл, созданный из функции.cpp и это работает. Щелкните правой кнопкой мыши на проекте ‘UnitTest1’ > свойства конфигурации > Компоновщик > ввод > дополнительные зависимости > добавить «..MyProjectTestDebugfunction.obj»

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

Я только что столкнулся с этой проблемой в Visual Studio 2013. По-видимому, теперь, имея два проекта в одном решении и устанавливая зависимости, недостаточно. Вам нужно добавить ссылку на проект между ними. Для этого:

  1. щелкните правой кнопкой мыши на проекте в решении explore
  2. Нажмите Добавить = > Ссылки.
  3. Нажмите кнопку Добавить новую ссылку
  4. установите флажки для проектов, которые использует этот проект на
  5. Нажмите кнопку ОК

другой способ, которым вы можете получить эту ошибку компоновщика (как и я), если вы экспортируете экземпляр класса из dll, но не объявили, что сам класс как импорт/экспорт.

так что, хотя в первую очередь я экспортировал только экземпляр книги класс book выше, я должен был объявить Book класс, как экспорт/импорт класса, а в противном случае вызов book.WordCount() в другой dll вызывал ошибку ссылки.

Я только что обнаружил, что LNK2019 происходит во время компиляции в Visual Studio 2015, если забыли предоставить определение для объявленной функции внутри класса.

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

для меня работает, если я добавлю эту строку ниже в .vcxproj in itemGroup cpp файл, который подключен к заголовочному файлу.

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

Проверьте набор символов обоих проектов в Свойства Конфигурации ->общие ->Набор Символов

мой UnitTest проект использовал набор символов по умолчанию Мульти-Байт в то время как мои libs где в Unicode.
Моя функция была с помощью TCHAR в качестве параметра. В результате в моей lib мой TCHAR был преобразовано на WCHAR но это char* на моем UnitTest: символ был другим, потому что параметры были действительно не то же самое в конце концов.

в Visual Studio 2017 если вы хотите протестировать общедоступные члены, просто поместите свой реальный проект и тестовый проект в одно и то же решение и добавьте ссылку на свой реальный проект в тестовом проекте.

посмотреть модульное тестирование C++ в Visual Studio из блога MSDN для получения более подробной информации. Вы также можете проверить написать модульные тесты для C / C++ в Visual Studio а также используйте платформу модульного тестирования Microsoft для C++ в Visual Studio, причем если вам нужно протестировать непубличных членов и нужно поместить тесты в тот же проект, что и ваш реальный код.

обратите внимание, что вещи, которые вы хотите протестировать должны быть экспортированы с помощью __declspec(dllexport) . Смотрите экспорт из DLL с помощью _ _ declspec (dllexport) для более подробной информации.

Ссылка на основную публикацию
Adblock
detector