Все используемые методы-члены должны быть определены, если они используются. Чтобы использовать эти символы, вы должны связать их с этими объектными файлами.
В секции gcc вы должны указать в командной строке все объектные файлы, которые вы хотите связать вместе, или скомпилировать файлы реализации вместе. Например, библиотечные файлы Linux обычно называются libfoo. В Windows тот же файл может называться foo.
Конечно, не ставьте пробел после -l или -l. В MSVS файлы, добавленные в проект, автоматически связывают свои объектные файлы, и обычно создается файл lib. Чтобы использовать символы в отдельном проекте, необходимо указать lib-файлы в настройках проекта.
При использовании сторонней библиотеки, которая поставляется с lib-файлом, невыполнение этого требования обычно приводит к ошибке. Также может случиться, что вы забудете добавить этот файл в компиляцию, в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавлять файлы в командной строке.
В MSVS добавление файла в проект приведет к его автоматической компиляции, хотя файлы можно вручную исключить из сборки. Найдите имя функции в документации, и она должна подсказать вам, какую библиотеку нужно использовать. Ответ 4 Переменная или функция объявлена, но не определена. Типичное объявление переменной Поскольку это только объявление, требуется одно определение. Тип возвращаемого значения функции, количество и типы параметров, а также соглашение о вызове не совпадают в точности.
В сообщении об ошибке компилятор часто дает полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что все детали совпадают. Ответ 5 Порядок, в котором перечислены взаимозависимые связанные библиотеки, неверен.
Порядок связывания библиотек имеет значение, если библиотеки зависят друг от друга. Теперь мы пытаемся откомментировать строки в src2. Теперь все гораздо глубже. Но мы - хакеры: , и мы можем это исправить. Откройте src1. Недавно я смог избавиться от нерешенной внешней ошибки в Visual Studio, просто перекомпилировав сломанный файл.
Когда я перекомпилировал, ошибка исчезла. Обычно это происходит, когда две или более библиотек имеют циклическую зависимость.
Библиотека A пытается использовать символы в B. Для начала ничего не существует. Когда вы пытаетесь скомпилировать A, шаг ссылки терпит неудачу, потому что не может найти B.
Тогда вы компилируете B, что приводит к успеху и генерирует B. Повторная компиляция A теперь будет работать, потому что B теперь найден. Давайте сначала проясним ситуацию. Что такое символ? Если коротко, то символ - это имя. Оно определяется пользователем или вводится библиотекой зависимостей другого пользователя. Что такое внешний? Рассматриваемый как единица трансляции, компилятор компилирует один модуль за раз и генерирует один объектный файл. Обратите внимание, что каждый заголовочный файл, включенный в этот исходный файл, будет предварительно обработан и рассматривается как часть этой единицы трансляции.
Все, что находится внутри единицы трансляции, считается внутренним, все остальное - внешним. Что такое Resolve? Resolve - это термин времени связывания. Во время связывания компоновщик пытается найти внешнее определение для каждого символа в объектных файлах, который не может найти свое собственное определение внутри.
Область применения этого процесса поиска включает: Все объектные файлы, созданные во время компиляции Все библиотеки. Этот процесс поиска называется разрешением. И наконец, зачем нужен нерешенный внешний символ? Если компоновщик не может найти внешнее определение для символа, у которого нет внутреннего определения, он сообщает об ошибке неразрешенного внешнего символа.
Возможные причины ошибки LNK Unresolved External Symbol Error. Мы уже знаем, что эта ошибка вызвана тем, что компоновщик не смог найти определение для внешних символов, возможные причины можно упорядочить следующим образом: Определение существует Например, если у нас есть функция foo, определенная в a.
Если у нас есть функция foo, определенная в a.
В этом случае мы знаем, что foo имеет свое определение в a. Это означает, что определение существует. Определение не существует Если мы хотим вызвать некоторые функции из библиотеки, но импортирующая библиотека не добавляет ее в дополнительный список зависимостей, заданный из: Project Properties Configuration Properties Linker Input Additional Dependency вашего проекта.
Теперь компоновщик сообщает LNK, поскольку определение не существует в текущей области поиска. Ответ 11 Реализации шаблонов не отображаются. Неопределенные шаблоны должны иметь свои определения для всех единиц перевода, которые их используют. Это означает, что нельзя разделять определение шаблона и файл реализации. Если вам необходимо разделить реализации, обычным обходным решением является файл impl, который вы указываете в конце заголовка, объявляющего шаблон.
Для дальнейшего объяснения и другого возможного решения для явного создания экземпляра см. ответ 12 Неопределенная ссылка на [email protected] или подобную "необычную" главную точку входа специально для visual-studio. Возможно, вы не выбрали правильный тип проекта в вашей среде IDE. Если ваша среда IDE поддерживает проекты Plain Console, вы можете выбрать этот тип проекта вместо проекта Windows-приложения. Здесь более подробно рассматриваются случаи 1 и 2 из реальной проблемы.
Ответ 14 Microsoft предлагает, чтобы pragma ссылалась на правильную библиотеку во время ссылки; pragma comment lib, "libname. Ответ 15 Пакет NuGet Visual Studio необходимо обновить для новой версии набора инструментов Я только что столкнулся с проблемой подключения libpng к Visual Studio Проблема заключалась в том, что в файле пакета были только библиотеки для Visual Studio и Правильным решением было надеяться, что разработчик выпустит обновленный пакет, а затем обновить его, но для меня это сработало, взломав дополнительную настройку для VS путем указания на файлы библиотек VS Я изменил v на v только в поле условия, очень аккуратно оставив путь к имени файла как v Это просто позволило Visual Studio ссылаться на библиотеки в году, а в этом
Далее скажем, что проект также зависит от десяти статических библиотек. Допустим, что мы находимся в Windows, и собираем наш проект в Visual Studio 20xx. Найдите в Visual Studio файл. Порядок компиляции не определен. Поэтому не стоит полагать, что это главный файл. Если файлы.
Вторую стадию компиляции выполняет Linker. Linker должен объединить весь объектный файл и построить конечный результат, который может быть исполняемым файлом или библиотекой Шаги по линковке проекта Разберите все объектные файлы и найдите определение, которое было объявлено только в заголовках, например: Код метода одного класса, как указано в предыдущих ответах, или событие инициализации статической переменной, которая является членом внутри класса Если один из символов не найден в объектных файлах, он также выполняется в дополнительных библиотеках.
Если Linker не находит исполняемый файл, он также выполняется в дополнительных библиотеках.
Если Linker находит внешний символ в одной статической библиотеке, он включает этот символ в вывод проекта. Однако если библиотека является общей динамической библиотекой, он не включает символы кода в выходные данные, и Run- It может вызвать сбои синхронизации.
Как решить эту ошибку Убедитесь, что ваш проект синтаксиса написан правильно. Ошибка синхронизации Linker Определите все символы, которые вы объявляете в заголовочных файлах. Используйте pragma once, чтобы запретить компилятору включать один заголовок, если он уже был включен в текущий.
При использовании шаблона убедитесь, что вы включили определение каждой функции шаблона в заголовочный файл, чтобы компилятор мог создать соответствующий код для всех экземпляров. Ответ 17 У меня недавно была такая проблема, и оказалось, что это ошибка Ответ 18 Используйте компоновщик для диагностики ошибки Большинство современных компоновщиков включают подробную опцию, которая в разной степени печатает: вызов командной строки, данные о том, какие библиотеки включены в шаг компоновки, расположение библиотек, используемые пути поиска.
Для gcc и clang обычно добавляют -v -Wl,--verbose или -v -Wl,-v в командную строку. Более подробную информацию можно найти здесь:.
Вас посетила замечательная мысль
Блог просто отличный, побольше бы подобных!
Могу порекомендовать зайти на сайт, где есть много статей на интересующую Вас тему.
Замечательно, это очень ценный ответ
качество дерьмо а так норм