Remkomplekty.ru

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

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

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

Код выложу, если нужен, ругается на две строчки:
differ_gen((double)lf,resp);
и
filt_gen((double)lf,(double)hf,resp);

Эти функции лежат в файле filt_gen.h

В файле — в котором ругается(filt1.h) пишу

то ошибка исчезает(ещеб) чего мне делать?

Добавлено 15.05.12, 06:11
Windows7 Professional
MicroSoft Visual Studio 2008

Код выложу, если нужен, ругается на две строчки:
differ_gen((double)lf,resp);
и
filt_gen((double)lf,(double)hf,resp);

Эти функции лежат в файле filt_gen.h

Можно побыть дураком? какая реализация?

Добавлено 15.05.12, 06:39
я подключал их, чтоб использовать в данном файле сами функции, которые лежат в заголовочном файле

Добавлено 15.05.12, 06:42
Как мне сделать реализацию?

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

Ну ты ведь их хочешь заюзать, ну эти функции ? Вот что они должны делать? Вот то что они должны делать — это и есть их реализация, если у тебя ее нема, то можешь сам сделать.

Добавлено 15.05.12, 06:50
подключи с помощью директивы #include в тот файл, в котором ты эти функции используешь, сразу после #pragma, и убери свои extern вместе с объявлением этих функций. И почитай про еденицу компиляции, у тебя все в *.h файлах судя по всему, а реализация должна быть в *.cpp файлах.

Я получаю сообщение об ошибке «LINK: ошибка LNK2001: неразрешенный внешний символ _WinMainCRTStartup»

Пожалуйста, помогите. В Visual Studio 2008 я получаю следующие ошибки.

Вот ситуация. — DiskTest.exe является одним из трех проектов в моем решении — Этот проект идеально подходит для Debug x64, Release x64 и Debug Win32. Release Win32 является единственным, кто генерирует эти ошибки. — Я трачу часы, сравнивая страницы свойств для всех 4 конфигураций конфигурации/машины, и уверен, что никаких свойств не хватает из одной версии в другую. Я обратил особое внимание на «Дополнительные зависимости», «Дополнительные каталоги библиотек», «Вход» и т.д. Конечно, пути к файлам .lib указывают на Debug илиRelease и x86 илиx64 для соответствующей конфигурации или платформы.

Единственная «дополнительная зависимость» этого проекта — SBF_Util.lib и SBF_Utild.lib для Debug. Я убедился, что все 4 версии (debug win32 и x64 и Release win32 и x64) этой библиотеки существуют в папке, указанной в каждом «дополнительном каталоге библиотеки». Я также проверил dumpbin на каждой версии библиотеки, чтобы убедиться, что платформа соответствует.

Я видел другие ситуации, в которых отсутствует основная точка входа, но в этом случае все остальные версии без проблем возникают, только в версии Win32 Relase генерируется эта ошибка, поэтому я не думаю, что мне нужно изменить что-либо в коде.

Может ли кто-нибудь дать какие-либо подсказки?, у меня нет идей. Любые идеи будут очень оценены. Спасибо.

Я нашел проблему! Это была невероятно простая вещь, которая вызывала эту криптовую ошибку: «ПРОСТРАНСТВО»

Оказывается, что в разделе Configuration- > C/С++ → OutputFiles- > Имя файла объекта: у меня было: «$ (IntDir) «

Не заметил места, пока я не обратил очень пристальное внимание на окно Kdiff3, и заметил это маленькое подчеркивание, чтобы сигнализировать пробел. Это место было там в течение нескольких месяцев, так как этот проект остался без присмотра (до того, как я вышел на борт), потому что никто не мог найти исправления для него, поэтому они просто перестали его использовать. Скорее всего, ошибка копирования-вставки.

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

Читать еще:  Ошибки http протокола

Откройте страницу настроек проекта, перейдите в LinkerСистема и изучите свойство SubSystem. Убедитесь, что он настроен на одинаковое значение во всех конфигурациях проекта, переключив конфигурацию из раскрывающегося списка конфигурации.

Предполагая, что ваша предполагаемая точка входа main (или один из ее вариантов, например _tmain или wmain ), вы должны убедиться, что для использования свойства SubSystem установлено значение CONSOLE.

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

Здравствуйте Shergin, вы писали:

S>msvc++6 при компиляции выдаёт:
S>Base.obj : error LNK2001: unresolved external symbol «public: void __thiscall CItem::Empty(void)» (?Empty@CItem@@QAEXXZ)
S>Что это значит? Что ему не понравилось?

гы-гы-гы.
Извиняюсь. не удержался.
MSDN Troubleshooting LNK2001 or L2029 Unresolved External Errors ID: Q138400
Рекомендую.

гы-гы-гы.
_ATL_MIN_CRT forever .

Здравствуйте Spini, вы писали:

Не ну чего за ботва. Мне конкретно кто-нибудь поможет?!

Кстати, что такое AFX?

Здравствуйте Shergin, вы писали:

S>———————Configuration: nai — Win32 Debug———————
S>Linking.
S>Base.obj : error LNK2001: unresolved external symbol «public: void __thiscall CItem::Empty(void)» (?Empty@CItem@@QAEXXZ)
S>Debug/nai.exe : fatal error LNK1120: 1 unresolved externals

CItem твой класс? Это значит, что ты не определил метод Empty, но где-то его вызываешь.

Здравствуйте IT, вы писали:

IT>Здравствуйте Shergin, вы писали:

S>>———————Configuration: nai — Win32 Debug———————
S>>Linking.
S>>Base.obj : error LNK2001: unresolved external symbol «public: void __thiscall CItem::Empty(void)» (?Empty@CItem@@QAEXXZ)
S>>Debug/nai.exe : fatal error LNK1120: 1 unresolved externals

IT>CItem твой класс? Это значит, что ты не определил метод Empty, но где-то его вызываешь.

Извини, но, по-моему, ты не прав. Ошибка возникает на стадии связывания, а не компиляции.
Эта ошибка всегда возникает, если я пытаюсь использовать классы созданные в других моих программах. Что мне делать?
ЗЫ: Естественно и речи не идет что CItem::Empty() не определен.

Hi Shergin, вы писали:

S>Извини, но, по-моему, ты не прав. Ошибка возникает на стадии связывания, а не компиляции.
S>Эта ошибка всегда возникает, если я пытаюсь использовать классы созданные в других моих программах. Что мне делать?
S>ЗЫ: Естественно и речи не идет что CItem::Empty() не определен.

Я извиняюсь за слишком эмоциональный ответ выше :o)), но просто у друга ;o) была эта ошибка недавно в ATL проекте

Все дело в том, что линкер не может «распознать» адрес функции.
Что за проект? Ошибка и на Release и на Debug версии?

Фишка в том, что «ссылка» на функцию есть в объектном файле, а реализации функции нет (_ОНИ_так_думают_). Похоже на то, что предположил IT. Свои DLL в проекте используешь? — помоему фишка в этом. или нет? Что значит «использовать классы созданные в других моих программах»?

Через форум тебе помочь мало реально (ИМХО). Еще раз говорю — чтобы понять причину ошибки посмотри MSDN

[ORIGINAL]
Frequent Causes of the «Unresolved External» Error Message
Missing Object Files or Libraries
Missing Function Body or Variable
Symbol Can’t be Found in the Libraries or Object Modules
Case Sensitivity
Name Decoration — обрати внимание
A Symbol Is Not Public
Scoping Problems and Pure Virtual Functions
Function Inlining
Wrong Compiler Options or Mixing Incompatible Librar

Здравствуйте Shergin, вы писали:

S>>>———————Configuration: nai — Win32 Debug———————
S>>>Linking.
S>>>Base.obj : error LNK2001: unresolved external symbol «public: void __thiscall CItem::Empty(void)» (?Empty@CItem@@QAEXXZ)
S>>>Debug/nai.exe : fatal error LNK1120: 1 unresolved externals

IT>>CItem твой класс? Это значит, что ты не определил метод Empty, но где-то его вызываешь.

S>Извини, но, по-моему, ты не прав. Ошибка возникает на стадии связывания, а не компиляции.

Может и не прав. Что бы сказать точно, нужно видеть твой проект. То что это линковщик я тоже вижу и так же вижу причину ошибки: нет такой функции. Она может и есть, но линковщик её не видит. Может быть ты компилируешь модули с разными опциями, может это тот глюк VS, который лечится просто перекомпиляцией всего проекта с предварительным удалением *.pch, может ещё что-то.

S>Эта ошибка всегда возникает, если я пытаюсь использовать классы созданные в других моих программах. Что мне делать?

Читать еще:  Ошибка переопределение c

Это пожалуй надо расшифровать, если речь идёт о dll, то теюе сюда — Использование DLL в программе на Visual C++

Автор(ы):
Александр Шаргин

В статье рассматривается три способа подключения DLL к программе на Visual C++ — неявное подключение (implicit linking), явное подключение (explicit linking) и отложенная загрузка (delayed load) DLL. Для каждого способа демонстрируется использование переменной, функции и класса из подключаемой DLL. В разделе об отложенной загрузке также приводится дополнительная информация (описание обработки исключений и использования функций-ловушек).

Error lnk2001 неразрешенный внешний символ

Так что я застрял на этом почти месяц. У меня есть проект MSVC ++ с библиотекой в ​​правильном каталоге и многословной сборкой диагностики. .LIB статически компилируется и работает:

dumpbin /headers GazeApiLib.lib

возвращает, между прочим:

Но подробная сборка завершается с ошибкой:

Пометка его как __cdecl вручную в заголовочном файле выдает эту ошибку:

1>main.obj : error LNK2001: unresolved external symbol «public: bool __cdecl gtl::GazeApi::connect(bool)» (?connect@GazeApi@gtl@@QAA_N_N@Z)

Так что, с одной стороны, похоже, что он успешно включает файл lib, но не может найти функцию, даже если прототипы точно совпадают. В чем дело?

РЕДАКТИРОВАТЬ: Еще немного информации, я запустил UndName и обнаружил, что не исправленное имя в файле LIB было:

public: bool __cdecl gtl::GazeApi::connect(bool) __ptr64

что немного отличается от подписи моего кода и объясняет, почему искаженные имена не совпадают (? connect @ GazeApi @ gtl @@ QAE_N_N @ Z против? connect @ GazeApi @ gtl @@ QAA_N_N @ Z)

Решение

Я почти уверен, что это разница в размере между двумя компиляциями. Ваша библиотека использует указатели 64-битного размера, а ваш проект компилируется с использованием 32-битного размера. Обратите внимание на E в искаженном имени функции в lib, что означает __ptr64 (? Connect @ GazeApi @ gtl @@ QЕAA_N_N @ Z).
Это дает, что объявление функции, соответствующей той, что в библиотеке

Не могу понять, в чем ошибка, поправьте, может, где-то что-то не так делаю. Если убрать StartClass(); , то программ-то пишет, что непонятно, чему равно s . Использую irrlicht , но в данной ситуации это не имеет значения.

Ошибка:

1 ответ 1

В ошибке сказано практически всё, что вам надо. У вас заявлен, но не определён конструктор класса StartClass .

Кроме того, метод Start выглядит подозрительно, т. к. он работает не с самим объектом (этот метод находится внутри класса, видите?), а создаёт временный объект, инициализирует его поля и тут же убивает его.

Думаю, вам нужен конструктор такого вида:

(а метод Start не нужен вовсе).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c++ или задайте свой вопрос.

Связанные

Похожие

дизайн сайта / логотип © 2020 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2020.1.13.35763

Главный файл проекта:

Заголовочный файл unit1.h:

Возникает ошибка:
LNK2001 неразрешенный внешний символ «»int X» (?X@@3HA)»

  • Вопрос задан более трёх лет назад
  • 2937 просмотров

Как говорят, «или крест снимите, или трусы наденьте». И учите понятие «единица компиляции».
По какой схеме устроен ваш проект? «Одна единица компиляции» или «много единиц компиляции»?

Си недалеко ушёл от ассемблеров. А в ассемблерах программа компилировалась по частям и собиралась воедино линкером (компоновщиком, редактором связей) — в те времена кода было много, а данных мало. Многие из ошибок невозможно было определить, не запустив линкер. Си++ пользуется многими из архитектурных особенностей ассемблеров и Си — по крайней мере ни одно из модульных решений не стало рекомендацией (кроме костыля extern template class ).

Но как говорить «переменная/функция есть, такого-то типа и в другой единице компиляции»? Для этого есть прототипы функций и extern-определения переменных. Их обычно вносят в заголовочные файлы с таким требованием: ничего, что находится в заголовочном файле, не должно производить кода. А код производят…
• Глобальные переменные (без typedef, extern).
• Нешаблонные функции (кроме inline).
• Полностью специализированные шаблонные функции (кроме inline).
• Команда «специализировать шаблон» (template class).

Читать еще:  Ошибка при сохранении

При этом…
• Функции в теле struct/class автоматически inline и кода не производят.
• Для неявной специализации шаблонов существуют обходы — код генерируется дважды, но ошибки не выдаёт.
• «Свой» хедер обычно включают первым, чтобы убедиться, что в нём нет недостающих зависимостей.

В системе «одна единица компиляции» всё просто: есть ровно один файл, подлежащий компиляции. Тогда в хедерных файлах вполне могут быть конструкции, производящие код.

Системы «одна единица компиляции» и «много единиц компиляции» можно комбинировать, но надо знать:
• Все хедеры, которые производят код, должны подключаться из одной-единственной единицы компиляции. Надо чётко осознавать, из какой, и не подключать из чужих.
• У библиотеки всё равно должен быть хедер-фасад, не производящий кода и предназначенный для стыковки с другими единицами компиляции.
Такая конструкция ускоряет полную перекомпиляцию и часто применяется для библиотек, но надо знать: огромные библиотеки вроде SqLite, в 5 мегабайт препроцессированного кода, мешают распараллеливанию компиляции (ибо пока откомпилируется SqLite, остальные процессоры вполне себе соберут остальную программу).

Я получаю сообщение об ошибке «LINK: ошибка LNK2001: неразрешенный внешний символ _WinMainCRTStartup»

Пожалуйста, помогите. В Visual Studio 2008 я получаю следующие ошибки.

Вот ситуация. — DiskTest.exe является одним из трех проектов в моем решении — Этот проект идеально подходит для Debug x64, Release x64 и Debug Win32. Release Win32 является единственным, кто генерирует эти ошибки. — Я трачу часы, сравнивая страницы свойств для всех 4 конфигураций конфигурации/машины, и уверен, что никаких свойств не хватает из одной версии в другую. Я обратил особое внимание на «Дополнительные зависимости», «Дополнительные каталоги библиотек», «Вход» и т.д. Конечно, пути к файлам .lib указывают на Debug илиRelease и x86 илиx64 для соответствующей конфигурации или платформы.

Единственная «дополнительная зависимость» этого проекта — SBF_Util.lib и SBF_Utild.lib для Debug. Я убедился, что все 4 версии (debug win32 и x64 и Release win32 и x64) этой библиотеки существуют в папке, указанной в каждом «дополнительном каталоге библиотеки». Я также проверил dumpbin на каждой версии библиотеки, чтобы убедиться, что платформа соответствует.

Я видел другие ситуации, в которых отсутствует основная точка входа, но в этом случае все остальные версии без проблем возникают, только в версии Win32 Relase генерируется эта ошибка, поэтому я не думаю, что мне нужно изменить что-либо в коде.

Может ли кто-нибудь дать какие-либо подсказки?, у меня нет идей. Любые идеи будут очень оценены. Спасибо.

Я нашел проблему! Это была невероятно простая вещь, которая вызывала эту криптовую ошибку: «ПРОСТРАНСТВО»

Оказывается, что в разделе Configuration- > C/С++ → OutputFiles- > Имя файла объекта: у меня было: «$ (IntDir) «

Не заметил места, пока я не обратил очень пристальное внимание на окно Kdiff3, и заметил это маленькое подчеркивание, чтобы сигнализировать пробел. Это место было там в течение нескольких месяцев, так как этот проект остался без присмотра (до того, как я вышел на борт), потому что никто не мог найти исправления для него, поэтому они просто перестали его использовать. Скорее всего, ошибка копирования-вставки.

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

Откройте страницу настроек проекта, перейдите в LinkerСистема и изучите свойство SubSystem. Убедитесь, что он настроен на одинаковое значение во всех конфигурациях проекта, переключив конфигурацию из раскрывающегося списка конфигурации.

Предполагая, что ваша предполагаемая точка входа main (или один из ее вариантов, например _tmain или wmain ), вы должны убедиться, что для использования свойства SubSystem установлено значение CONSOLE.

Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×