Undefined что это за ошибка как исправить
Произошла ошибка Undefined в Яндекс почта
В середине декабря 2016 года (с 16 декабря и после) ряд пользователей электронных почтовых ящиков на Yandex массово столкнулись с невозможностью отправки своей электронной корреспонденции и соответствующими сообщениями «undefine error», «error data failed» и рядом других в Яндекс почте. При этом повторная попытка отправить электронную почту также оканчивается неудачно, система выдаёт ту же ошибку, и что далее делать в данной ситуации пользователь не знает и не представляет. В этой статье я расскажу, что это за ошибка Undefined в Яндексе, каковы могут быть её причины, и что делать, если произошла данная ошибка.
Что за ошибка в почтовом сервисе Яндекса
Ответ на вопрос о том, что это ошибка, следует начать с перевода текста самой ошибки. В переводе с английского языка «undefined» означает «неопределённый». Соответственно, под данным термином система Яндекса обозначает неопределённую ошибку, суть которой системе не известна (или, при использовании языка Javascript, такое значение получается при обращении к переменной или объекту, которые были созданы, но ещё не инициализированы).
Соответственно, если мы имеем дело с «неопределённой» ошибкой, то причины возникновения последней могут быть различными. Некоторые из специалистов связанных с «Яндекс» выдвигают версию о DOS-атаке, направленной на серверы Яндекса, к которой могли приложить руку зарубежные хакеры (выдвигается даже достаточно сомнительная версия о «мести» компании Гугл за скандальное антимонопольное дело, инициированное компанией «Яндекс»).
Тем не менее, сервис Яндекс.Почта, которым пользуются около 27 миллионов человек, примерно с 16 декабря стал регулярно выдавать ошибку «undefined error», а частная и корпоративная почта многих почтовых аккаунтов на Яндекс не была вовремя доставлена к месту назначения.
Как исправить ошибку Undefined в Яндекс почта
Поскольку, как я уже упоминал чуть выше, это ошибка не пользовательская, а самого сервиса Яндекс, это существенно повлиять на развитие ситуации вы вряд ли сможете. Тем не менее, могу порекомендовать вам ряд действий, способных помочь в вопросе устранения ошибки в почтовом сервисе Яндекса. Итак:
Заключение
Как уже упоминалось выше, если у вас случилась ошибка Undefined в Яндекс почта, то это ошибка самого почтового сервиса, и существенно повлиять на ситуацию вы можете лишь обратившись с соответствующим уведомлением в службу технической поддержки. По состоянию на дату написания данного материала подобные проблемы были уже в целом устранены, а почтовый сервис Яндекс ныне работает без заметных проблем.
Ошибки в JavaScript и как их исправить
JavaScript может быть кошмаром при отладке: некоторые ошибки, которые он выдает, могут быть очень трудны для понимания с первого взгляда, и выдаваемые номера строк также не всегда полезны. Разве не было бы полезно иметь список, глядя на который, можно понять смысл ошибок и как исправить их? Вот он!
Ниже представлен список странных ошибок в JavaScript. Разные браузеры могут выдавать разные сообщения об одинаковых ошибках, поэтому приведено несколько примеров там, где возможно.
Как читать ошибки?
Перед самим списком, давайте быстро взглянем на структуру сообщения об ошибке. Понимание структуры помогает понимать ошибки, и вы получите меньше проблем, если наткнетесь на ошибки, не представленные в этом списке.
Типичная ошибка из Chrome выглядит так:
Теперь к самим ошибкам.
Uncaught TypeError: undefined is not a function
Связанные ошибки: number is not a function, object is not a function, string is not a function, Unhandled Error: ‘foo’ is not a function, Function Expected
Возникает при попытке вызова значения как функции, когда значение функцией не является. Например:
Эта ошибка обычно возникает, если вы пытаетесь вызвать функцию для объекта, но опечатались в названии.
Другие вариации, такие как “number is not a function” возникают при попытке вызвать число, как будто оно является функцией.
Как исправить ошибку: убедитесь в корректности имени функции. Для этой ошибки, номер строки обычно указывает в правильное место.
Uncaught ReferenceError: Invalid left-hand side in assignment
Связанные ошибки: Uncaught exception: ReferenceError: Cannot assign to ‘functionCall()’, Uncaught exception: ReferenceError: Cannot assign to ‘this’
Вызвано попыткой присвоить значение тому, чему невозможно присвоить значение.
Наиболее частый пример этой ошибки — это условие в if:
В этом примере программист случайно использовал один знак равенства вместо двух. Выражение “left-hand side in assignment” относится к левой части знака равенства, а, как можно видеть в данном примере, левая часть содержит что-то, чему нельзя присвоить значение, что и приводит к ошибке.
Uncaught TypeError: Converting circular structure to JSON
Связанные ошибки: Uncaught exception: TypeError: JSON.stringify: Not an acyclic Object, TypeError: cyclic object value, Circular reference in value argument not supported
Так как a и b в примере выше имеют ссылки друг на друга, результирующий объект не может быть приведен к JSON.
Как исправить ошибку: удалите циклические ссылки, как в примере выше, из всех объектов, которые вы хотите сконвертировать в JSON.
Unexpected token ;
Связанные ошибки: Expected ), missing ) after argument list
Интерпретатор JavaScript что-то ожидал, но не обнаружил там этого. Обычно вызвано пропущенными фигурными, круглыми или квадратными скобками.
Токен в данной ошибке может быть разным — может быть написано “Unexpected token ]”, “Expected <” или что-то еще.
Как исправить ошибку: иногда номер строки не указывает на правильное местоположение, что затрудняет исправление ошибки.
Ошибка с [ ] < >( ) обычно вызвано несовпадающей парой. Проверьте, все ли ваши скобки имеют закрывающую пару. В этом случае, номер строки обычно указывает на что-то другое, а не на проблемный символ.
Unexpected / связано с регулярными выражениями. Номер строки для данного случая обычно правильный.
Unexpected; обычно вызвано символом; внутри литерала объекта или массива, или списка аргументов вызова функции. Номер строки обычно также будет верным для данного случая.
Uncaught SyntaxError: Unexpected token ILLEGAL
Связанные ошибки: Unterminated String Literal, Invalid Line Terminator
В строковом литерале пропущена закрывающая кавычка.
Как исправить ошибку: убедитесь, что все строки имеют правильные закрывающие кавычки.
Uncaught TypeError: Cannot read property ‘foo’ of null, Uncaught TypeError: Cannot read property ‘foo’ of undefined
Связанные ошибки: TypeError: someVal is null, Unable to get property ‘foo’ of undefined or null reference
Попытка прочитать null или undefined так, как будто это объект. Например:
Как исправить ошибку: обычно вызвано опечатками. Проверьте, все ли переменные, использованные рядом со строкой, указывающей на ошибку, правильно названы.
Uncaught TypeError: Cannot set property ‘foo’ of null, Uncaught TypeError: Cannot set property ‘foo’ of undefined
Связанные ошибки: TypeError: someVal is undefined, Unable to set property ‘foo’ of undefined or null reference
Попытка записать null или undefined так, как будто это объект. Например:
Как исправить ошибку: это тоже обычно вызвано ошибками. Проверьте имена переменных рядом со строкой, указывающей на ошибку.
Uncaught RangeError: Maximum call stack size exceeded
Связанные ошибки: Uncaught exception: RangeError: Maximum recursion depth exceeded, too much recursion, Stack overflow
Обычно вызвано неправильно программной логикой, что приводит к бесконечному вызову рекурсивной функции.
Как исправить ошибку: проверьте рекурсивные функции на ошибки, которые могут вынудить их делать рекурсивные вызовы вечно.
Uncaught URIError: URI malformed
Связанные ошибки: URIError: malformed URI sequence
Как исправить ошибку: убедитесь, что вызовы decodeURIComponent на строке ошибки получают корректные входные данные.
XMLHttpRequest cannot load some/url. No ‘Access-Control-Allow-Origin’ header is present on the requested resource
Связанные ошибки: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at some/url
Эта проблема всегда связана с использованием XMLHttpRequest.
Как исправить ошибку: убедитесь в корректности запрашиваемого URL и в том, что он удовлетворяет same-origin policy. Хороший способ найти проблемный код — посмотреть на URL в сообщении ошибки и найти его в своём коде.
InvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
Связанные ошибки: InvalidStateError, DOMException code 11
Означает то, что код вызвал функцию, которую нельзя было вызывать в текущем состоянии. Обычно связано c XMLHttpRequest при попытке вызвать на нём функции до его готовности.
Как исправить ошибку: посмотрите на код в строке, указывающей на ошибку, и убедитесь, что он вызывается в правильный момент или добавляет нужные вызовы до этого (как с xhr.open ).
Заключение
JavaScript содержит в себе одни из самых бесполезных ошибок, которые я когда-либо видел, за исключением печально известной Expected T_PAAMAYIM_NEKUDOTAYIM в PHP. Большая ознакомленность с ошибками привносит больше ясности. Современные браузеры тоже помогают, так как больше не выдают абсолютно бесполезные ошибки, как это было раньше.
Какие самые непонятные ошибки вы встречали? Делитесь своими наблюдениями в комментариях.
Произошла ошибка Undefined в Яндекс почта
В середине декабря 2016 года (с 16 декабря и после) ряд пользователей электронных почтовых ящиков на Yandex массово столкнулись с невозможностью отправки своей электронной корреспонденции и соответствующими сообщениями «undefined error», «error data failed» и рядом других в Яндекс почте. При этом повторная попытка отправить электронную почту также оканчивается неудачно, система выдаёт ту же ошибку, и что далее делать в данной ситуации пользователь не знает и не представляет. В этой статье я расскажу, что это за ошибка Undefined в Яндекс почта, каковы могут быть её причины, и что делать если произошла ошибка Undefined в почте от Яндекс.
Яндекс почта
Что за ошибка Undefined в почтовом сервисе
Ответ на вопрос о том, что это ошибка Undefined в Яндекс, следует начать с перевода текста самой ошибки. В переводе с английского языка «undefined» означает «неопределённый». Соответственно, под данным термином система Яндекса обозначает неопределённую ошибку, суть которой системе не известна (или, при использовании языка Javascript, значение «undefined» получается при обращении к переменной или объекту, которые были созданы, но ещё не инициализированы).
Соответственно, если мы имеем дело с «неопределённой» ошибкой, то причины возникновения последней могут быть различными. Некоторые из специалистов связанных с «Яндекс» выдвигают версию о DOS-атаке, направленной на серверы Яндекса, к которой могли приложить руку зарубежные хакеры (выдвигается даже достаточно сомнительная версия о «мести» компании Гугл за скандальное антимонопольное дело, инициированное компанией «Яндекс»).
Ошибка Undefined
Тем не менее, сервис Яндекс.Почта, которым пользуются около 27 миллионов человек, примерно с 16 декабря стал регулярно выдавать ошибку «undefined error», а частная и корпоративная почта многих почтовых аккаунтов на Яндекс не была вовремя доставлена к месту назначения.
Как исправить ошибку Undefined в Яндекс почта
Поскольку, как я уже упоминал чуть выше, это ошибка не пользовательская, а самого сервиса Яндекс, это существенно повлиять на развитие ситуации вы вряд ли сможете. Тем не менее, могу порекомендовать вам ряд действий, способных помочь в вопросе устранения ошибки Undefined в почтовом сервисе Яндекса. Итак:
Заключение
Как уже упоминалось выше, если у вас произошла ошибка Undefined в Яндекс почта, то это ошибка самого почтового сервиса, и существенно повлиять на ситуацию вы можете лишь обратившись с соответствующим уведомлением в службу технической поддержки. По состоянию на дату написания данного материала подобные проблемы были уже в целом устранены, а почтовый сервис Яндекс ныне работает без заметных проблем.
7 советов по обработке undefined в JavaScript
Авторизуйтесь
7 советов по обработке undefined в JavaScript
Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.
Что такое undefined в JavaScript
undefined является специальным значением. Согласно спецификации ECMAScript, undefined в JavaScript можно получить при доступе к неинициализированным переменным, несуществующим свойствам объекта, несуществующим элементам массива, etc. Пример:
Как видим, undefined выводится при попытке доступа к:
Оператор typeof возвращает строку undefined для неопределённого значения:
Оператор typeof отлично подходит для проверки значения undefined в JavaScript:
Как избежать undefined в JavaScript
Неинициализированная переменная
Ниже приведены способы решения проблемы.
1. const и let вместо var
Объявленные таким образом объекты и переменные находятся в области видимости, ограниченной текущим блоком кода, и находятся во временной мёртвой зоне до момента присвоения им значения.
При использовании неизменяемых данных (констант) рекомендуется инициализировать их как const :
Константа не подвергается неинициализированному состоянию, и получить значение undefined в этом случае невозможно.
13–15 декабря, Онлайн, Беcплатно
Если вам нужно менять значение переменной, то обозначьте её как let и также присваивайте ей начальное значение:
Проблема var заключается в поднятии переменных: где бы ни находилось объявление, это равнозначно тому, что переменную объявили в начале кода.
В этом случае переменная myVariable содержит undefined до получения значения:
2. Усиление связности
Связность характеризует степень взаимосвязи элементов модуля (пространства имён, класса, метода, блока кода). Сильная связность предпочтительнее, поскольку предполагает, что элементы модуля должны фокусироваться исключительно на одной задаче. Это поможет модулю быть:
Блок кода сам по себе может считаться небольшим модулем. Чтобы извлечь выгоду из преимуществ сильной связности, нужно держать переменные как можно ближе к блоку кода, который их использует.
Вот классический пример того, как не надо делать:
Доступ к несуществующему свойству
Сам по себе доступ к не вызовет ошибку, а вот при попытке получить значение из несуществующего свойства выведется ошибка:
Проблема в особенностях JavaScript: свойство может быть установлено или отсутствовать. Хорошее решение — установка правил, которые обязывают задать свойствам значения.
Но не всегда возможно контролировать объекты, с которыми приходится работать. Такие объекты могут иметь разный набор свойств в различных сценариях, и каждый из них нужно обрабатывать вручную.
0 и false — ложные значения, потому что if (toAppend.first)<> и if (toAppend.last)<> фактически сравниваются с ложными значениями, и эти элементы не вставляются в массив. Функция возвращает исходный массив [10] без изменений.
1. Наличие свойства
К счастью, JavaScript предлагает множество способов определить, имеет ли объект определённое свойство:
2. Деструктуризация доступа к свойствам объекта
Деструктуризация объекта позволяет устанавливать значение по умолчанию, если свойство не существует: удобно для исключения прямого контакта с undefined :
Применяя преимущества деструктуризации объекта, реализуем quote() :
Деструктурирующее присваивание гарантирует, что используется пустой объект, если второй аргумент не указан вообще. В результате вы избегаете возникновения значения undefined в JavaScript.
3. Свойство по умолчанию
Есть простой способ установить значения по умолчанию для свойств объекта, и имя ему Spread syntax:
Параметры функции
Функция, имеющая определённые параметры, должна вызываться с одинаковым количеством аргументов. В таком случае параметры получают ожидаемые значения:
Лучшим подходом является использование параметров по умолчанию из ES2015:
Возвращаемое значение функции
То же происходит, если return присутствует, но без какого-либо выражения рядом:
Теперь вызов функции выведет нужное значение.
Оператор void
Оператор void выполняет выражение и возвращает undefined вне зависимости от результата:
Одним из вариантов использования оператора void является переопределение результата выполнения выражения и возврат undefined в случае возникновения неожиданных результатов выполнения функции.
Значение undefined в массивах
Вы получаете undefined при попытке доступа к элементу массива с индексом вне пределов массива.
В JavaScript вы можете столкнуться с так называемыми разрежёнными массивами. Эти массивы имеют пробелы, то есть на некоторых индексах не определены никакие элементы. Когда делаем попытку получить доступ к пустому значению в разрежённом массиве, на выходе получаем undefined :
Отличие null и undefined в JavaScript
Основное отличие в том, что undefined представляет значение переменной, которая ещё не была инициализирована, а null — намеренное отсутствие объекта.
Допустим, переменная number определена, но ей не назначено начальное значение:
То же самое произойдёт при попытке доступа к несуществующему свойству объекта:
Или переменная должна ожидать возвращение объекта функции, но по какой-то причине создание объекта невозможно. В этом случае null является значимым индикатором недостающего объекта. Например, clone() — это функция, которая клонирует простой объект JavaScript. Ожидается, что функция вернёт объект:
Строгий оператор равенства === также отличает undefined от null :
Вам также может быть интересна наша статья про обработку ошибок в JavaScript.
Заключение
Стратегия борьбы с undefined в JavaScript:
Что такое undefined ссылка/неразрешенная внешняя ошибка символов и как ее исправить?
Каковы undefined ссылки/нерешенные внешние ошибки символов? Каковы распространенные причины и способы их устранения/предотвращения?
Не стесняйтесь редактировать/добавлять свои собственные.
ОТВЕТЫ
Ответ 1
Компиляция программы на С++ выполняется в несколько этапов, как указано 2.2 (кредиты для Кейта Томпсона для справки):
Приоритет среди правил синтаксиса перевода определяется следующими фазами [см. сноску].
[footnote] Реализации должны вести себя так, как если бы эти отдельные фазы происходили, хотя на практике разные фазы могли складываться вместе.
Указанные ошибки возникают на этом последнем этапе компиляции, чаще всего называемом связыванием. Это в основном означает, что вы собрали кучу файлов реализации в объектные файлы или библиотеки, и теперь вы хотите заставить их работать вместе.
Аналогичные механизмы существуют и для других компиляторов/платформ.
создаст следующие ошибки с помощью GCC:
и аналогичные ошибки с Microsoft Visual Studio:
Общие причины включают:
Ответ 2
Члены класса:
Деструктор pure virtual нуждается в реализации.
Объявление деструктора по-прежнему требует определения его (в отличие от обычной функции):
Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.
virtual методы должны быть реализованы или определены как чистые.
Это похоже на методы не virtual без определения, с добавлением аргументов, что чистая декларация генерирует фиктивный vtable, и вы можете получить ошибку компоновщика без использования функции:
Чтобы это сработало, объявите X::foo() как чистый:
Члены класса
Некоторые члены должны быть определены, даже если они не используются явно:
Ниже приведена ошибка:
Реализация может быть встроенной в самом определении класса:
Все используемые методы-члены должны быть определены, если они используются.
Общей ошибкой является отказ от названия:
Определение должно быть
static члены данных должны быть определены вне класса в единице перевода:
Ответ 3
Отказ от ссылки на соответствующие библиотеки/объектные файлы или компиляцию файлов реализации
Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единице перевода. Чтобы использовать эти символы, вы должны привязать их к этим объектным файлам.
В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.
Для XCode: добавьте пути поиска заголовка пользователя → добавьте путь поиска библиотеки → перетащите фактическую ссылку на библиотеку в папку проекта.
Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).
Ответ 4
Объявлено, но не определено переменная или функция.
Типичное объявление переменной
Поскольку это только объявление, требуется одиночное определение. Соответствующим определением будет:
Например, следующее приведет к ошибке:
Аналогичные замечания относятся к функциям. Объявление функции без ее определения приводит к ошибке:
Будьте осторожны, чтобы выполняемая вами функция точно соответствовала той, которую вы указали. Например, у вас могут быть несоответствующие cv-квалификаторы:
Другие примеры несоответствий включают
Сообщение об ошибке из компилятора часто дает вам полное объявление переменной или функции, которая была объявлена, но не определена. Сравните его с определением, которое вы указали. Убедитесь, что каждая деталь соответствует.
Ответ 5
Порядок, в котором указаны взаимозависимые связанные библиотеки, неверен.
Итак, повторим еще раз, порядок ДОЛЖЕН!
Ответ 6
что такое undefined ссылка/неразрешенный внешний символ
Я попытаюсь объяснить, что такое «undefined ссылка/неразрешенный внешний символ».
note: я использую g++ и Linux, и все примеры для него
Например, у нас есть код
Сделать объектные файлы
После фазы ассемблера мы имеем объектный файл, который содержит любые экспортируемые символы. Посмотрите на символы
Я отклонил некоторые строки из вывода, потому что они не имеют значения
Итак, мы видим следующие символы для экспорта.
src2.cpp ничего не экспортирует, и мы не видели его символов
Свяжите наши объектные файлы
Линкер видит экспортированные символы и связывает его. Теперь мы пытаемся раскомментировать строки в src2.cpp, как здесь.
и перестроить файл объекта
ОК (нет ошибок), потому что мы только создаем объектный файл, ссылка еще не завершена. Попробуйте связать
Это произошло потому, что наше local_var_name статично, то есть оно не видно для других модулей. Теперь глубже. Получить выход фазы перевода
Итак, мы видели, что для local_var_name нет метки, поэтому компоновщик ее не нашел. Но мы хакеры:), и мы можем это исправить. Откройте src1.s в текстовом редакторе и измените
то есть. вы должны иметь ниже
мы изменили видимость local_var_name и установили его значение 456789. Попробуйте создать из него объектный файл
ok, см. вывод на экран (символы)
теперь local_var_name имеет Bind GLOBAL (был локальным)
ok, мы его взломаем:)
Ответ 7
Символы были определены в программе на языке C и используются в коде С++.
Функция (или переменная) void foo() была определена в программе на C, и вы пытаетесь использовать ее в программе на С++:
Компилятор С++ ожидает, что имена будут искажены, поэтому вы должны объявить эту функцию как:
Эквивалентно, вместо определения в программе на C, функция (или переменная) void foo() была определена в С++, но с C-связью:
и вы пытаетесь использовать его в С++-программе с С++-связью.
Если вся библиотека включена в заголовочный файл (и была скомпилирована как код C); включение должно быть следующим:
Ответ 8
Если все остальное не удается, перекомпилируйте.
Недавно я смог избавиться от нерешенной внешней ошибки в Visual Studio 2012, просто перекомпилировав нарушивший файл. Когда я перестроил, ошибка исчезла.
Это обычно происходит, когда две (или более) библиотеки имеют циклическую зависимость. Библиотека A пытается использовать символы в B.lib и библиотеке B пытается использовать символы из A.lib. Ничего не существует для начала. Когда вы пытаетесь скомпилировать A, шаг ссылки завершится неудачно, потому что он не может найти B.lib. A.lib будет сгенерирован, но не будет dll. Затем вы компилируете B, который будет успешным и сгенерирует B.lib. Повторная компиляция A теперь будет работать, потому что теперь найден B.lib.
Ответ 9
Неправильно импортировать/экспортировать методы/классы по модулям /dll (специфичный для компилятора).
Эта двойная функциональность обычно получается с помощью макроса:
Макрос THIS_MODULE будет определен только в модуле, который экспортирует функцию. Таким образом, декларация:
и сообщает компилятору экспортировать функцию, так как текущий модуль содержит свое определение. Если включить объявление в другом модуле, он будет расширяться до
и сообщает компилятору, что определение находится в одной из библиотек, к которым вы привязались (см. также 1)).
Вы можете подобрать классы импорта/экспорта:
Ответ 10
Это одно из самых запутанных сообщений об ошибках, которые каждый программист VС++ видел снова и снова. Давайте сначала сделаем чёткость.
Этот процесс поиска называется разрешением.
Д. Наконец, почему Unresolved External Symbol? Если компоновщик не может найти внешнее определение для символа, который не имеет внутреннего определения, он сообщает об ошибке неразрешенного внешнего символа.
E. Возможные причины LNK2019: ошибка неразрешенного внешнего символа. Мы уже знаем, что эта ошибка связана с тем, что компоновщик не смог найти определение внешних символов, возможные причины могут быть отсортированы как:
Например, если у нас есть функция foo, определенная в a.cpp:
В b.cpp мы хотим вызвать функцию foo, поэтому добавим
объявить функцию foo() и вызвать ее в другом теле функции, скажем bar() :
Если мы хотим вызвать некоторые функции в библиотеке, но библиотека импорта не добавляется в дополнительный список зависимостей (установленный из: Project | Properties | Configuration Properties | Linker | Input | Additional Dependency ) вашего проекта. Теперь компоновщик сообщит LNK2019, поскольку определение не существует в текущей области поиска.
Ответ 11
Реализации шаблонов не отображаются.
Чтобы исправить это, вы должны переместить определение X::foo в файл заголовка или какое-либо место, видимое для единицы перевода, которая его использует.
Специализированные шаблоны могут быть реализованы в файле реализации, и реализация не должна быть видимой, но специализация должна быть объявлена ранее.
Для дальнейшего объяснения и другого возможного решения (явное создание экземпляра) см. этот вопрос и ответ.
Ответ 12
неопределенная ссылка на [email protected] или аналогичную «необычную» main() точку main() точки входа (особенно для visual-studio).
Возможно, вы пропустили выбор правильного типа проекта с помощью вашей реальной среды IDE. IDE может захотеть связать, например, проекты приложений Windows с такой функцией точки входа (как указано в недостающей ссылке выше), вместо обычно используемого int main(int argc, char** argv); подпись.
Если ваша среда IDE поддерживает проекты Plain Console, вы можете выбрать этот тип проекта, а не проект приложения Windows.
Здесь case1 и case2 обрабатываются более подробно из реальной проблемы.
Ответ 13
Также, если вы используете сторонние библиотеки, убедитесь, что у вас есть правильные 32/64 битные файлы.
Ответ 14
Microsoft предлагает #pragma ссылаться на нужную библиотеку во время ссылки;
В дополнение к пути библиотеки, включая каталог библиотеки, это должно быть полное имя библиотеки.
Ответ 15
Пакет Visual Studio NuGet необходимо обновить для новой версии набора инструментов
У меня просто возникла проблема с подключением libpng с Visual Studio 2013. Проблема в том, что в файле пакета были только библиотеки для Visual Studio 2010 и 2012.
Ответ 16
Что означает компиляция?
Второй этап компиляции выполняется Linker.Linker должен объединить весь объектный файл и построить окончательно вывод (который может быть исполняемым или библиотекой)
Шаги по связыванию проекта
Наблюдение
Как решить эту ошибку
Ошибка времени компилятора:
Ошибка времени компоновщика
Ответ 17
Ошибка в компиляторе /IDE
У меня недавно была эта проблема, и оказалось, что это была ошибка
Ответ 18
Используйте компоновщик, чтобы помочь диагностировать ошибку
Большинство современных линкеров включают подробный вариант, который печатается в различной степени;
Для MSVC в командную строку линии добавляется /VERBOSE (в частности, /VERBOSE:LIB ).
Ответ 19
У меня была такая же проблема. Скажем, у меня есть проекты MyProject и TestProject. Я эффективно связал файл lib для MyProject с TestProject. Однако этот файл lib был создан, так как была построена DLL для MyProject. Кроме того, я не содержал исходный код для всех методов в MyProject, а только доступ к точкам входа в DLL.
Ответ 20
Поскольку люди, похоже, обращаются к этому вопросу, когда речь идет о ошибках компоновщика, я собираюсь добавить это здесь.
Одна из возможных причин ошибок компоновщика с GCC 5.2.0 заключается в том, что по умолчанию теперь выбрана новая библиотека ABI libstdС++.
Если вы получаете ошибки компоновщика о undefined ссылках на символы, которые включают типы в пространстве имен std:: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать вместе файлы объектов, которые были скомпилированы с помощью различные значения для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.
Итак, если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0, это будет проверкой.
Ответ 21
Обертка вокруг GNU ld, которая не поддерживает сценарии компоновщика
Ответ 22
Подружиться с шаблонами.
С учетом фрагмента кода типа шаблона с оператором (или функцией) друга;
Так как он не реализован, компоновщик не находит его и приводит к ошибке.
Позволяя дружбе распространяться на все экземпляры шаблонов, следующим образом:
Или реализация для operator может быть выполнена внутри внутри определения класса;
Обратите внимание, что когда объявление оператора (или функции) появляется только в классе, имя не доступно для «нормального» поиска, только для зависимого от аргумента поиска, от cppreference;
Имя, объявленное ранее в объявлении друга в классе или классе, шаблон X становится членом самого внутреннего охватывающего пространства имен X, но недоступен для поиска (кроме зависимого от аргумента поиска, который учитывает X), если соответствующее объявление на область пространства имен предоставляется.
В качестве побочного примечания к образцу неудачного кода; g++ предупреждает об этом следующим образом
warning: friend declaration ‘std::ostream& operator
note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
Ответ 23
Ваша ссылка потребляет библиотеки перед файлами объектов, которые относятся к ним
Примеры в C. Они также могут быть С++
Минимальный пример, связанный с созданной вами статической библиотекой
my_lib.c
my_lib.h
eg1.c
Вы создаете свою статическую библиотеку:
Вы компилируете свою программу:
Вы пытаетесь связать его с libmy_lib.a и сбой:
Тот же результат, если вы выполните компиляцию и ссылку за один шаг, например:
Минимальный пример, включающий общую системную библиотеку, библиотеку сжатия libz
eg2.c
Скомпилируйте свою программу:
Попробуйте связать свою программу с libz и выполните сбой:
То же самое, если вы компилируете и связываете за один раз:
И вариант на примере 2 с участием pkg-config :
Что вы делаете неправильно?
В последовательности объектных файлов и библиотек, которые вы хотите связать, чтобы сделать свой вы размещаете библиотеки перед объектными файлами, которые ссылаются на их. Вы должны поместить библиотеки после того, как файлы объектов, которые ссылаются к ним.
Правильно ссылайтесь на пример 1:
Правильно ссылайтесь на пример 2:
Правильно ссылайтесь на пример 2 pkg-config :
Объяснение
Чтение необязательно здесь.
По умолчанию команда привязки, сгенерированная GCC, в вашем дистрибутиве, расходует файлы в ссылке слева направо последовательность командной строки. Когда он обнаруживает, что файл ссылается на что-то и не содержит определения для него, будет искать определение в файлах дальше вправо. Если в конечном итоге оно найдет определение, ссылка разрешена. Если какие-либо ссылки остаются неразрешенными в конце, связь не выполняется: компоновщик не ищет назад.
Сначала пример 1, со статической библиотекой my_lib.a
Когда вы пытаетесь связать программу следующим образом:
Затем он находит eg1.o и добавляет его в программу. Объектный файл в последовательность ссылок всегда добавляется в программу. Теперь программа делает ссылка на hw и не содержит определения hw ; но в последовательности связей нет ничего, что могло бы обеспечить отсутствие определение. Ссылка на hw заканчивается неразрешенной, и связь не выполняется.
Во-вторых, пример 2, с общей библиотекой libz
Общая библиотека не является архивом объектных файлов или чего-либо подобного. Это гораздо больше похожа на программу, у которой нет функции main и вместо этого предоставляет множество других символов, которые он определяет, так что другие программы могут использовать их во время выполнения.
Во время выполнения загрузчик системной программы загрузит копию libz в тот же процесс, что и ваша программа, когда он загружает копию вашей программы, для ее запуска.
Но когда вы пытаетесь связать программу, например:
Наконец, вариант pkg-config примера 2 имеет теперь очевидное объяснение. После расширения оболочки:
который снова является примером 2.
Я могу воспроизвести проблему в примере 1, но не в примере 2
отлично подходит для вас!
(Или: эта связь работала хорошо для вас, скажем, Fedora 23, но не работает на Ubuntu 16.04)
Это потому, что дистрибутив, на котором работает ссылка, является одним из тех, не настраивает свою привязку GCC для связывания разделяемых библиотек по мере необходимости.
В тот же день для UNIX-подобных систем было нормально связывать статические и общие библиотеки по разным правилам. Статические библиотеки в последовательности связей были связаны по мере необходимости, объясняется в примере 1, но разделяемые библиотеки были связаны безоговорочно.
Это неэкономично во время выполнения, поскольку это может привести к тому, что общие библиотеки будут загружаются вместе с программой, даже если они не нужны.
Этот компромисс привел сегодня к раскольнической ситуации. Некоторые дистрибутивы изменили свои правила привязки GCC для разделяемых библиотек, чтобы, по мере необходимости, принцип применяется ко всем библиотекам. Некоторые дистрибутивы застряли со старым путь.
Почему я все еще получаю эту проблему, даже если я компилирую-ссылку в то же время?
Если я просто сделаю:
Поскольку компиляция и привязка к одной команде не меняют порядок последовательности связей.
Когда вы запустите команду выше, gcc выяснит, что вы хотите компилировать + связь. Таким образом, за кулисами, он генерирует команду компиляции и запускает он генерирует команду привязки и запускает ее, как если бы вы запускали две команды:
См. также
Ответ 24
Когда ваши пути включения различаются
Как работают линкеры? Линкер соответствует объявлению функции (объявленному в заголовке) с его определением (в общей библиотеке) путем сравнения их подписи. Вы можете получить ошибку компоновщика, если компоновщик не найдет определение функции, которое идеально подходит.
Возможно ли получить ошибку компоновщика, даже если объявление и определение, похоже, совпадают? Да! Они могут выглядеть одинаково в исходном коде, но это действительно зависит от того, что видит компилятор. По существу, вы можете столкнуться с такой ситуацией:
Обратите внимание, что, хотя обе декларации функций выглядят одинаково в исходном коде, но они действительно различаются в зависимости от компилятора.
Пример того, как это может произойти в реальном мире, объясняется ниже.
Дальнейшая разработка с примером
И затем вы идете вперед и включаете библиотеку в свой собственный проект.
Boom! Вы получаете ошибку компоновщика, и вы не знаете, почему это не удается. Причина в том, что в общей библиотеке используются разные версии одного и того же include common_math.h (я сделал это очевидным здесь в этом примере, включив другой путь, но это может быть не всегда так очевидно. Возможно, путь include отличается в настройки компилятора).
Отладка компоновщика
Процесс выполняется следующим образом:
[1] По проекту я имею в виду набор исходных файлов, которые связаны друг с другом для создания либо библиотеки, либо исполняемого файла.
РЕДАКТИРОВАТЬ 1: переписать первый раздел, который будет легче понять. Пожалуйста, прокомментируйте ниже, чтобы сообщить мне, нужно ли что-то еще исправлять. Спасибо!
Ответ 25
Непоследовательные определения UNICODE
Чтобы исправить это, создайте все необходимые библиотеки и проекты с последовательным определением UNICODE (и _UNICODE ).
Это можно сделать либо с помощью:
Или в настройках проекта;
Свойства проектa > Общие > Значения по умолчанию > Набор символов
Или в командной строке;
Альтернатива применима также, если UNICODE не предназначен для использования, убедитесь, что определения не установлены, и/или многосимвольная настройка используется в проектах и последовательно применяется.
Не забывайте быть совместимыми между сборками «Release» и «Debug».
Ответ 26
Очистить и восстановить
«Чистый» сборщик может удалить «мертвую древесину», которая может быть оставлена лежащей вокруг предыдущих сборок, неудачными сборками, неполными сборками и другими проблемами сборки, связанными с сборкой.
В общем случае IDE или сборка будет включать в себя некоторую форму «чистой» функции, но это может быть неправильно настроено (например, в ручном make файле) или может завершиться неудачей (например, промежуточные или результирующие двоичные файлы доступны только для чтения).
После завершения «очистки» убедитесь, что «чистый» преуспел, и все созданные промежуточные файлы (например, автоматический make файл) были успешно удалены.
Этот процесс можно рассматривать как окончательный вариант, но часто является хорошим первым шагом; особенно если недавно был добавлен код, связанный с ошибкой (локально или из исходного репозитория).
Ответ 27
Отсутствует «extern» в const объявления/определения переменных (только С++)
Для людей, приезжающих с C, может быть неожиданностью, что в С++ глобальные переменные const имеют внутреннюю (или статическую) связь. В C это не так, поскольку все глобальные переменные неявно extern (т.е. Когда отсутствует ключевое слово static ).
— использовать заголовочный файл и включать его в файлы file2.cpp и file1.cpp
В качестве альтернативы можно было объявить переменную const в файле file1.cpp с явным extern
Ответ 28
Несмотря на то, что это довольно старые вопросы с несколькими принятыми ответами, я хотел бы поделиться тем, как устранить ошибку скрытого «неопределенная ссылка на».
Разные версии библиотек
Я использовал псевдоним для ссылки на std::filesystem::path : файловая система находится в стандартной библиотеке начиная с С++ 17, но моя программа должна была также компилироваться в С++ 14, поэтому я решил использовать переменный псевдоним:
Допустим, у меня есть три файла: main.cpp, file.h, file.cpp:
Обратите внимание на различные библиотеки, используемые в main.cpp и file.h. Поскольку main.cpp # include’d «file.h» после & lt;файловой системы>, используемой там версией файловой системы была версия С++ 17., Я использовал для компиляции программы с помощью следующих команд:
Разрешение
Чтобы это исправить, мне просто нужно было изменить & lt; экспериментальный :: файловая система> в file.h на & lt; файловую систему>.
Ответ 29
При связывании с разделяемыми библиотеками убедитесь, что используемые символы не скрыты.
Вы можете проверить, являются ли символы, которые вы ищете, внешними, вызывая:
скрытые/локальные символы отображаются с помощью nm с символом нижнего регистра, например t вместо «T для кодового раздела:
Подобно Windows-dll, можно было бы отметить публичные функции с помощью определения, например DLL_PUBLIC определенного как:
Что примерно соответствует версии Windows/MSVC:
Более подробную информацию о видимости можно найти в wiki.
Чтобы найти, какие символы в объектном файле скрыты, выполните:
Ответ 30
Разные архитектуры
Вы можете увидеть сообщение как:
В этом случае это означает, что доступные символы для другой архитектуры, чем та, для которой вы компилируете.
В Visual Studio это происходит из-за неправильной «Платформы», и вам нужно либо выбрать подходящую, либо установить правильную версию библиотеки.
В Linux это может быть связано с неправильной папкой библиотеки (например, с использованием lib вместо lib64 ).
В MacOS есть возможность отправить обе архитектуры в одном файле. Может быть, что ссылка ожидает, что обе версии будут там, но только одна есть. Это также может быть проблема с неправильной папкой lib / lib64 которой находится библиотека.