Windows symbols in lib

Ошибка средств компоновщика LNK2001 Linker Tools Error LNK2001

неразрешенный внешний символ «символ» unresolved external symbol «symbol«

Скомпилированный код создает ссылку или вызов символа. The compiled code makes a reference or call to symbol. Символ не определен ни в одной из библиотек или объектных файлов, поиск которого осуществляется компоновщиком. The symbol isn’t defined in any libraries or object files searched by the linker.

Это сообщение об ошибке после неустранимой ошибки LNK1120. This error message is followed by fatal error LNK1120. Чтобы устранить ошибку LNK1120, сначала исправьте все ошибки LNK2001 и LNK2019. To fix error LNK1120, first fix all LNK2001 and LNK2019 errors.

Существует множество способов получения ошибок LNK2001. There are many ways to get LNK2001 errors. Все они используют ссылку на функцию или переменную, которую компоновщик не может Разрешить, или найти определение для. All of them involve a reference to a function or variable that the linker can’t resolve, or find a definition for. Компилятор может определить, когда код не объявляет символ, но не в том случае, если он не определен . The compiler can identify when your code doesn’t declare a symbol, but not when it doesn’t define one. Это связано с тем, что определение может находиться в другом исходном файле или библиотеке. That’s because the definition may be in a different source file or library. Если код ссылается на символ, но он никогда не определен, компоновщик создает ошибку. If your code refers to a symbol, but it’s never defined, the linker generates an error.

Что такое неразрешенный внешний символ? What is an unresolved external symbol?

Символ — это внутреннее имя функции или глобальной переменной. A symbol is the internal name for a function or global variable. Это форма имени, используемая или определенная в скомпилированном объектном файле или библиотеке. It’s the form of the name used or defined in a compiled object file or library. Глобальная переменная определяется в объектном файле, где для него выделяется хранилище. A global variable is defined in the object file where storage is allocated for it. Функция определена в объектном файле, где размещается скомпилированный код для тела функции. A function is defined in the object file where the compiled code for the function body is placed. Внешний символ является ссылкой в одном файле объекта, но определен в другой библиотеке или объектном файле. An external symbol is one referenced in one object file, but defined in a different library or object file. Экспортированный символ — это открытый объект, который становится общедоступным для файлового файла или библиотеки, определяющей его. An exported symbol is one that’s made publicly available by the object file or library that defines it.

Для создания приложения или библиотеки DLL в каждом используемом символе должно быть определено определение. To create an application or DLL, every symbol used must have a definition. Компоновщик должен Разрешить или найти определение сопоставления для каждого внешнего символа, на который ссылается каждый файл объекта. The linker must resolve, or find the matching definition for, every external symbol referenced by each object file. Компоновщик создает ошибку, если не удается разрешить внешний символ. The linker generates an error when it can’t resolve an external symbol. Это означает, что компоновщику не удалось найти соответствующее определение экспортированного символа в любом из связанных файлов. It means the linker couldn’t find a matching exported symbol definition in any of the linked files.

Проблемы компиляции и компоновки Compilation and link issues

Эта ошибка может возникать: This error can occur:

Если в проекте отсутствует ссылка на библиотеку (. LIB) или Object (. OBJ-файл). When the project is missing a reference to a library (.LIB) or object (.OBJ) file. Чтобы устранить эту проблему, добавьте в проект ссылку на требуемую библиотеку или файл объекта. To fix this issue, add a reference to the required library or object file to your project. Дополнительные сведения см. в разделе lib files as input компоновщика. For more information, see lib Files as linker input.

Если проект содержит ссылку на библиотеку (. LIB) или Object (. OBJ), который, в свою очередь, требуются символы из другой библиотеки. When the project has a reference to a library (.LIB) or object (.OBJ) file that in turn requires symbols from another library. Это может произойти даже в том случае, если не вызываются функции, вызывающие зависимость. It may happen even if you don’t call functions that cause the dependency. Чтобы устранить эту проблему, добавьте в проект ссылку на другую библиотеку. To fix this issue, add a reference to the other library to your project. Дополнительные сведения см. в разделе понимание классической модели для связывания: использование символов в качестве пути. For more information, see Understanding the classical model for linking: Taking symbols along for the ride.

При использовании параметров /NODEFAULTLIB или /Zl . If you use the /NODEFAULTLIB or /Zl options. При указании этих параметров библиотеки, содержащие требуемый код, не будут связаны с проектом, если они не включены явным образом. When you specify these options, libraries that contain required code aren’t linked into the project unless you’ve explicitly included them. Чтобы устранить эту проблему, явно включите все библиотеки, используемые в командной строке компоновки. To fix this issue, explicitly include all the libraries you use on the link command line. Если при использовании этих параметров отображается множество отсутствующих имен функций CRT или стандартной библиотеки, явно включите библиотеки CRT и библиотеки стандартных библиотек или файлы библиотеки в ссылку. If you see many missing CRT or Standard Library function names when you use these options, explicitly include the CRT and Standard Library DLLs or library files in the link.

При компиляции с параметром /CLR . If you compile using the /clr option. Возможно, отсутствует ссылка на .cctor . There may be a missing reference to .cctor . Дополнительные сведения об устранении этой проблемы см. в разделе Инициализация смешанных сборок. For more information on how to fix this issue, see Initialization of mixed assemblies.

Читайте также:  Завис линукс с флешки

Если при построении отладочной версии приложения вы связываетесь с библиотеками в режиме выпуска. If you link to the release mode libraries when building a debug version of an application. Аналогично, если вы используете параметры /MTD или /MDD или определяете, _DEBUG а затем связываетесь с библиотеками выпусков, то во многих других случаях следует рассчитывать на множество потенциальных неразрешенных внешних значений. Similarly, if you use options /MTd or /MDd or define _DEBUG and then link to the release libraries, you should expect many potential unresolved externals, among other problems. Связывание сборки в режиме выпуска с отладочными библиотеками также вызывает аналогичные проблемы. Linking a release mode build with the debug libraries also causes similar problems. Чтобы устранить эту проблему, убедитесь, что вы используете отладочные библиотеки в отладочных сборках и розничных библиотеках в ваших розничных сборках. To fix this issue, make sure you use the debug libraries in your debug builds, and retail libraries in your retail builds.

Если код ссылается на символ из одной версии библиотеки, но вы связываете другую версию библиотеки. If your code refers to a symbol from one library version, but you link a different version of the library. Как правило, нельзя смешивать объектные файлы или библиотеки, созданные для разных версий компилятора. Generally, you can’t mix object files or libraries that are built for different versions of the compiler. Библиотеки, поставляемые в одной версии, могут содержать символы, которые не могут быть найдены в библиотеках, включенных в другие версии. The libraries that ship in one version may contain symbols that can’t be found in the libraries included with other versions. Чтобы устранить эту проблему, создайте все объектные файлы и библиотеки с одной и той же версией компилятора, прежде чем связывать их друг с другом. To fix this issue, build all the object files and libraries with the same version of the compiler before linking them together. Дополнительные сведения см. в разделе C++ двоичная совместимость 2015-2019. For more information, see C++ binary compatibility 2015-2019.

Если пути к библиотекам устарели. If library paths are out of date. Средства > параметры > проектов > диалоговом окне Каталоги VC + + в разделе файлы библиотеки позволяют изменить порядок поиска библиотеки. The Tools > Options > Projects > VC++ Directories dialog, under the Library files selection, allows you to change the library search order. Папка Компоновщик в диалоговом окне страницы свойств проекта может также содержать неактуальные пути. The Linker folder in the project’s Property Pages dialog box may also contain paths that could be out of date.

При установке нового Windows SDK (возможно, в другое расположение). When a new Windows SDK is installed (perhaps to a different location). Необходимо обновить порядок поиска библиотеки, чтобы он указывал на новое расположение. The library search order must be updated to point to the new location. Как правило, путь следует поместить в новый каталог include и lib для пакета SDK перед расположением Visual C++ по умолчанию. Normally, you should put the path to new SDK include and lib directories in front of the default Visual C++ location. Кроме того, проект, содержащий внедренные пути, может по-прежнему указывать на старые пути, которые являются допустимыми, но устарели. Also, a project containing embedded paths may still point to old paths that are valid, but out of date. Обновите пути для новых функций, добавленных новой версией, которая установлена в другое расположение. Update the paths for new functionality added by the new version that’s installed to a different location.

При построении в командной строке и создании собственных переменных среды. If you build at the command line, and have created your own environment variables. Убедитесь, что пути к инструментам, библиотекам и файлам заголовков имеют одинаковую версию. Verify that the paths to tools, libraries, and header files go to a consistent version. Дополнительные сведения см. в разделе Задание переменных пути и среды для сборок из командной строки . For more information, see Set the path and environment variables for command-line builds

Проблемы кодирования Coding issues

Эта ошибка может быть вызвана следующими причинами. This error can be caused by:

Несовпадение регистра в исходном коде или файле определения модуля (DEF). Mismatched case in your source code or module-definition (.def) file. Например, если вы назначите переменную var1 в одном исходном файле C++ и попытаетесь получить к ней доступ VAR1 , как в другой, возникает эта ошибка. For example, if you name a variable var1 in one C++ source file and try to access it as VAR1 in another, this error is generated. Чтобы устранить эту проблему, используйте согласованное написание имен и имена регистров. To fix this issue, use consistently spelled and cased names.

Проект, использующий встраивание функций. A project that uses function inlining. Это может произойти при определении функций inline в исходном файле, а не в файле заголовка. It can occur when you define the functions as inline in a source file, rather than in a header file. Встроенные функции не отображаются за пределами исходного файла, который их определяет. Inlined functions can’t be seen outside the source file that defines them. Чтобы устранить эту проблему, определите встроенные функции в заголовках, где они объявляются. To fix this issue, define the inlined functions in the headers where they’re declared.

Вызов функции C из программы на языке C++ без использования extern «C» объявления для функции C. Calling a C function from a C++ program without using an extern «C» declaration for the C function. Компилятор использует разные внутренние соглашения об именовании символов для кода C и C++. The compiler uses different internal symbol naming conventions for C and C++ code. Внутреннее имя символа — это то, что ищет компоновщик при разрешении символов. The internal symbol name is what the linker looks for when resolving symbols. Чтобы устранить эту проблему, используйте extern «C» обертку для всех объявлений функций C, используемых в коде C++, в результате чего компилятор должен использовать внутреннее соглашение об именовании языка c для этих символов. To fix this issue, use an extern «C» wrapper around all declarations of C functions used in your C++ code, which causes the compiler to use the C internal naming convention for those symbols. Параметры компилятора /TP и /TC заставляют компилятор компилировать файлы как C++ или C соответственно, независимо от расширения имени файла. Compiler options /Tp and /Tc cause the compiler to compile files as C++ or C, respectively, no matter what the filename extension is. Эти параметры могут привести к тому, что имена внутренних функций отличаются от предполагаемых. These options can cause internal function names different from what you expect.

Читайте также:  Что значит если windows является подлинной

Попытка сослаться на функции или данные, у которых нет внешней компоновки. An attempt to reference functions or data that don’t have external linkage. В C++ встроенные функции и const данные имеют внутреннюю компоновку, если явно не указано в качестве extern . In C++, inline functions and const data have internal linkage unless explicitly specified as extern . Чтобы устранить эту проблему, используйте явные extern объявления для символов, которые ссылаются вне определяющего исходного файла. To fix this issue, use explicit extern declarations on symbols referred to outside the defining source file.

Отсутствует тело функции или определение переменной . A missing function body or variable definition. Эта ошибка часто возникает при объявлении, но не определении, переменных, функций или классов в коде. This error is common when you declare, but don’t define, variables, functions, or classes in your code. Компилятору требуется только прототип функции или extern объявление переменной, чтобы создать объектный файл без ошибок, но компоновщик не может разрешить вызов функции или ссылку на переменную, так как код функции или переменное пространство не зарезервированы. The compiler only needs a function prototype or extern variable declaration to generate an object file without error, but the linker can’t resolve a call to the function or a reference to the variable because there’s no function code or variable space reserved. Чтобы устранить эту проблему, обязательно Определите каждую указанную функцию и переменную в исходном файле или библиотеке, на которую вы связываетесь. To fix this issue, make sure to define every referenced function and variable in a source file or library you link.

Вызов функции, который использует типы возвращаемых значений и параметров или соглашения о вызовах, которые не соответствуют объектам в определении функции. A function call that uses return and parameter types or calling conventions that don’t match the ones in the function definition. В объектных файлах C++ декорирование имен кодирует соглашение о вызовах, область класса или пространства имен, а также типы возвращаемых данных и параметров функции. In C++ object files, Name decoration encodes the calling convention, class or namespace scope, and return and parameter types of a function. Закодированная строка становится частью окончательного декорированного имени функции. The encoded string becomes part of the final decorated function name. Это имя используется компоновщиком для разрешения или сопоставления вызовов функции из других объектных файлов. This name is used by the linker to resolve, or match, calls to the function from other object files. Чтобы устранить эту проблему, убедитесь, что в объявлении функции, определении и вызовах используются одни и те же области, типы и соглашения о вызовах. To fix this issue, make sure the function declaration, definition, and calls all use the same scopes, types, and calling conventions.

Код C++, который вызывается при включении прототипа функции в определение класса, но не включает реализацию функции. C++ code you call, when you include a function prototype in a class definition, but don’t include the implementation of the function. Чтобы устранить эту проблему, обязательно предоставьте определение для всех членов класса, которые вы вызываете. To fix this issue, be sure to provide a definition for all class members you call.

Попытка вызвать чисто виртуальную функцию из абстрактного базового класса. An attempt to call a pure virtual function from an abstract base class. Чистая виртуальная функция не имеет реализации базового класса. A pure virtual function has no base class implementation. Чтобы устранить эту проблему, убедитесь, что все вызванные виртуальные функции реализованы. To fix this issue, make sure all called virtual functions are implemented.

Попытка использовать переменную, объявленную в функции (Локальная переменная), за пределами области этой функции. Trying to use a variable declared within a function (a local variable) outside the scope of that function. Чтобы устранить эту проблему, удалите ссылку на переменную, которая не находится в области действия, или переместите переменную в область более высокого уровня. To fix this issue, remove the reference to the variable that isn’t in scope, or move the variable to a higher scope.

При построении окончательной версии проекта ATL создается сообщение о том, что код запуска CRT является обязательным. When you build a Release version of an ATL project, producing a message that CRT startup code is required. Чтобы устранить эту проблему, выполните одно из следующих действий. To fix this issue, do one of the following,

Удалите _ATL_MIN_CRT из списка определений препроцессора, чтобы разрешить включение кода запуска CRT. Remove _ATL_MIN_CRT from the list of preprocessor defines to allow CRT startup code to be included. Дополнительные сведения см. в разделе Страница свойств «Общие» (проект). For more information, see General property page (Project).

Если это возможно, удалите вызовы функций CRT, требующих код запуска CRT. If possible, remove calls to CRT functions that require CRT startup code. Вместо этого используйте эквиваленты Win32. Instead, use their Win32 equivalents. Например, используйте lstrcmp вместо strcmp . For example, use lstrcmp instead of strcmp . Известными функциями, требующими код запуска CRT, являются некоторые функции строк и вычислений с плавающей запятой. Known functions that require CRT startup code are some of the string and floating point functions.

Проблемы согласованности Consistency issues

В настоящее время нет стандарта для декорирования имен C++ между поставщиками компиляторов или даже между разными версиями одного и того же компилятора. There’s currently no standard for C++ name decoration between compiler vendors, or even between different versions of the same compiler. Объектные файлы, скомпилированные с разными компиляторами, могут не использовать одинаковую схему именования. Object files compiled with different compilers may not use the same naming scheme. Связывание их может вызвать ошибку LNK2001. Linking them can cause error LNK2001.

Смешивание встроенных и невстроенных параметров компиляции в разных модулях может вызвать ошибку LNK2001. Mixing inline and non-inline compile options on different modules can cause LNK2001. Если библиотека C++ создается с включенной функцией встраивания функций (/Ob1 или /Ob2), но соответствующий заголовочный файл, описывающий функции, отключен (без inline ключевого слова), возникает эта ошибка. If a C++ library is created with function inlining turned on (/Ob1 or /Ob2) but the corresponding header file describing the functions has inlining turned off (no inline keyword), this error occurs. Чтобы устранить эту проблему, определите функции inline в файле заголовка, который включается в другие исходные файлы. To fix this issue, define the functions inline in the header file you include in other source files.

Читайте также:  Что такое microsoft windows server standard 2016

Если вы используете #pragma inline_depth директиву компилятора, убедитесь, что задано значение 2 или более, и убедитесь, что вы также используете параметр компилятора /Ob1 или /Ob2 . If you use the #pragma inline_depth compiler directive, make sure you’ve set a value of 2 or greater, and make sure you also use the /Ob1 or /Ob2 compiler option.

Эта ошибка может возникать, если опустить параметр LINK/NOENTRY при создании библиотеки DLL только для ресурсов. This error can occur if you omit the LINK option /NOENTRY when you create a resource-only DLL. Чтобы устранить эту проблему, добавьте параметр/NOENTRY в команду Link. To fix this issue, add the /NOENTRY option to the link command.

Эта ошибка может возникать, если в проекте используются неверные параметры/SUBSYSTEM или/ENTRY. This error can occur if you use incorrect /SUBSYSTEM or /ENTRY settings in your project. Например, при написании консольного приложения и задании/SUBSYSTEM: WINDOWS создается неразрешенная внешняя ошибка для WinMain . For example, if you write a console application and specify /SUBSYSTEM:WINDOWS, an unresolved external error is generated for WinMain . Чтобы устранить эту проблему, убедитесь, что вы соответствуете параметрам типа проекта. To fix this issue, make sure you match the options to the project type. Дополнительные сведения об этих параметрах и точках входа см. в разделе Параметры компоновщика /SUBSYSTEM и /entry . For more information on these options and entry points, see the /SUBSYSTEM and /ENTRY linker options.

Ошибки экспортированного файла DEF Exported .def file symbol issues

Эта ошибка возникает, когда экспорт, указанный в DEF-файле, не найден. This error occurs when an export listed in a .def file isn’t found. Это может быть вызвано тем, что экспорт не существует, написан неправильно или использует декорированные имена C++. It could be because the export doesn’t exist, is spelled incorrectly, or uses C++ decorated names. DEF-файл не имеет декорированных имен. A .def file doesn’t take decorated names. Чтобы устранить эту проблему, удалите ненужные экспорты и используйте extern «C» объявления для экспортированных символов. To fix this issue, remove unneeded exports, and use extern «C» declarations for exported symbols.

Использовать декорированное имя для поиска ошибки Use the decorated name to find the error

Компилятор и компоновщик C++ используют декорирование имен, также называемое искажением имени. The C++ compiler and linker use Name Decoration, also known as name-mangling. Декорирование имен кодирует дополнительные сведения о типе переменной в ее имени символа. Name decoration encodes extra information about the type of a variable in its symbol name. Имя символа для функции кодирует свой возвращаемый тип, типы параметров, область и соглашение о вызовах. The symbol name for a function encodes its return type, parameter types, scope, and calling convention. Это декорированное имя — это имя символа, которое компоновщик ищет для разрешения внешних символов. This decorated name is the symbol name the linker searches for to resolve external symbols.

Ошибка связи может возникнуть, если объявление функции или переменной не полностью соответствует определению функции или переменной. A link error can result if the declaration of a function or variable doesn’t exactly match the definition of the function or variable. Это связано с тем, что все различия становятся частью имени символа для сопоставления. That’s because any difference becomes part of the symbol name to match. Ошибка может возникать даже в том случае, если один и тот же файл заголовка используется как в вызывающем, так и в коде, определяющем код. The error can happen even if the same header file is used in both the calling code and the defining code. Это может произойти, если вы компилируете исходные файлы с помощью различных флагов компилятора. One way it may occur is if you compile the source files by using different compiler flags. Например, если код компилируется для использования __vectorcall соглашения о вызовах, но вы связываетесь с библиотекой, которая ожидает, что клиенты будут вызывать его с помощью соглашения по умолчанию __cdecl или __fastcall вызова. For example, if your code is compiled to use the __vectorcall calling convention, but you link to a library that expects clients to call it using the default __cdecl or __fastcall calling convention. В этом случае символы не совпадают, поскольку соглашения о вызовах различаются. In this case, the symbols don’t match because the calling conventions are different.

Чтобы помочь вам найти причину, в сообщении об ошибке отображаются две версии имени. To help you find the cause, the error message shows you two versions of the name. В нем отображается «понятное имя», имя, используемое в исходном коде, и декорированное имя (в круглых скобках). It displays both the «friendly name,» the name used in source code, and the decorated name (in parentheses). Вам не нужно знать, как интерпретировать декорированное имя. You don’t need to know how to interpret the decorated name. Вы по-прежнему можете выполнять поиск и сравнивать его с другими декорированными именами. You can still search for and compare it with other decorated names. Программы командной строки могут помочь найти и сравнить ожидаемое имя символа и фактическое имя символа: Command-line tools can help to find and compare the expected symbol name and the actual symbol name:

Параметры /EXPORTS и /SYMBOLS программы командной строки DUMPBIN полезны здесь. The /EXPORTS and /SYMBOLS options of the DUMPBIN command-line tool are useful here. Они могут помочь вам определить, какие символы определены в DLL-файле и файлах объектов или библиотек. They can help you discover which symbols are defined in your .dll and object or library files. Можно использовать список символов, чтобы убедиться, что экспортированные декорированные имена соответствуют декорированным именам, которые ищет компоновщик. You can use the symbols list to verify that the exported decorated names match the decorated names the linker searches for.

В некоторых случаях Компоновщик может сообщать только о декорированном имени символа. In some cases, the linker can only report the decorated name for a symbol. Для получения недекорированной формы декорированного имени можно использовать программу командной строки UNDNAME. You can use the UNDNAME command-line tool to get the undecorated form of a decorated name.

Оцените статью