Fatal error lnk1120 1 unresolved externals masm

Ответили на вопрос 1 человек. Оцените лучшие ответы! И подпишитесь на вопрос, чтобы узнавать о появлении новых ответов.

app.obj : error LNK2001: unresolved external symbol _MessageBoxA@16
app.exe : fatal error LNK1120: 1 unresolved externals

include <masm32includeuser32.inc>
include <masm32includekernel32.inc>
includelib <masm32libuser32.lib>
includelib <masm32libkernel32.lib>

.data

 
ClassName db «SimpleWinClass»,0
AppName db «Our First Window»,0 ; Для функции MessageBox
hello_mess1 db «Нажата левая клавиша мыши»,0
hello_mess2 db «Нажата правая клавиша мыши»,0
hello_title db «Ура!»,0

.data?

 
hInstance HINSTANCE ?
hInst HINSTANCE ?
CommandLine LPSTR ?
wc WNDCLASSEX <?>
msg MSG <?>
hwnd HWND ?
.code

 
start:

 
invoke GetModuleHandle,NULL
mov hInstance,eax
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW+1
mov wc.lpszMenuName,NULL

mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL, hInst,NULL

 
mov hwnd,eax
invoke ShowWindow,hwnd,SW_SHOWNORMAL
invoke UpdateWindow,hwnd
MSG_LOOP: 

 
invoke GetMessage,ADDR msg,NULL,0,0

 
cmp eax,0

 
je END_LOOP

 
invoke TranslateMessage,ADDR msg

 
invoke DispatchMessage,ADDR msg

 
jmp MSG_LOOP

END_LOOP:

 
mov eax,msg.wParam

 
invoke ExitProcess,eax
WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
cmp uMsg,WM_DESTROY
je WMDESTROY
cmp uMsg,WM_LBUTTONDOWN
je LBUTTON

 
cmp uMsg,WM_RBUTTONDOWN
je RBUTTON

 
JMP DEFWNDPROC

WMDESTROY:

 
invoke PostQuitMessage,NULL
xor eax,eax

 
jmp FINISH

 
LBUTTON:

 
invoke MessageBoxA,0,addr hello_mess1,addr hello_title,MB_OK
jmp FINISH

 
RBUTTON: 

 
invoke MessageBoxA,0,addr hello_mess2,addr hello_title,MB_OK
jmp FINISH

 
DEFWNDPROC: 

 
invoke DefWindowProc,hWnd,uMsg,wParam,lParam

FINISH: 

 
ret WndProc endp

  • Remove From My Forums
  • Question

  • Hi

    I am migrating my application from vc++6.0 to vc++2013

    I am facing this following error

    This error is pointing to parsed.dll file, and when i checked for its availability it was not found there.

    Can you suggest what will be the solution for this

    Thanks

Answers

  • It should go in the main folder of your project.

    Then in the sybesql.cpp file, add the following line of code somewhere (at or near the top is the usual place):

    #pragma comment( lib, "libcs.lib" )
    

    Then try compiling again. You may need additional files from the link that Wyck suggested and if so each one would get its own additional #pragma comment… line.

    Another way to set it is to go in to your project’s properties, and then in the linker properties add it to the link library dependencies. See:
    http://msdn.microsoft.com/en-us/library/024awkd1.aspx .


    Visual C++ MVP | Website |
    Blog | @mikebmcl |
    Windows Store DirectX Game Template

    • Marked as answer by

      Monday, February 3, 2014 6:27 AM

  • If you’re having trouble understanding a specific error, then copy and paste the text of that error here and we can help you figure it out.

    Unresolved external means that your code compiled (so all symbols were known at compile time) but something requires external linkage and
    that thing was not found.  Usually this comes from including a header without linking against the associated library.

    In its simplest form, here’s an example

    void foo(); // This prototype is implicitly "extern"
    
    int main()
    {
       foo();
       return 0;
    }

    This program will compile because there is a prototype (a declaration) of the function
    foo, but its implementation is not given, so it is assumed to be external.  If there were a .lib file that provided the implementation of foo, then you could specify that .lib as an additional library file and it would link fine.  This happens
    if foo is expected to come from an external static library or an external dynamic link library (by way of an import library).

    So in your case, something is unresolved at link time.  You haven’t disclosed what symbol is unresolved, but it’s highly relevant.


    You also haven’t mentioned anything about parsed.dll.  But I can only assume that you are seeing an error of an unresolved external that you suspect comes from the implib for parsed.dll.  If so, then to resolve that, you need to find the import
    library for parsed.lib and link it into your program by specifying it as an additional library file in your project settings, or with a #pragma comment lib directive.

    If parsed.dll is something you built yourself, then you can add a project reference to it and include it in your solution and specify your project to automatically link the import library from
    parsed.

    But I’m just guessing (in those last two paragraphs) so you should really post the specific error and then I can help you with the specifics without guessing.

    • Marked as answer by
      Jane Wang — MSFT
      Monday, February 3, 2014 6:27 AM

  • If you can’t find the .cpp file then use the second method instead. Include it in your project’s link library dependencies. Here’s a fuller description of how to do that (make sure you back up your project or commit all changes to version control first
    so that you can restore it if anything goes wrong):

    1. In Visual Studio, go to Solution Explorer (you can find it in the VIEW menu if it isn’t visible) and right click on your project. In the context menu that appears, choose «Properties».
    2. In the project’s Property Pages, change the «Configuration» to «All Configurations» and the «Platform» to «All Platforms». If there is only one platform there won’t be an «All Platforms» option in which case you don’t need to change that setting.
    3. Then under «Configuration Properties», expand «Linker» and left click on «Input».
    4. You should now see various options, one of which is «Additional Dependencies».
    5. If the text box next to «Additional Dependencies» says «<different options>» then to be safe you should go back and for «Configuration» instead of using «All Configurations» switch to one of the individual configurations (e.g. «Debug») and for
      «Platform» switch away from «All Platforms» to one of the individual platforms (e.g. «Win32») and repeat the following steps for each combination of configuration and platform one-by-one until you have configured all of them.
    6. If you left click in the text box next to «Additional Dependencies», it should become a drop down menu. Left click on the arrow button that appeared on the right and choose «Edit…».
    7. A window called «Additional Dependencies» will appear. This is where you can specify the additional .lib files that your project depends on. The inherited values box just tells you the .lib files that are automatically included for you because they contain
      functionality that is commonly used. You don’t need to worry about them.
    8. In the text box above inherited values is where you will be entering data. There may already be some values specified in there. If so leave them alone. Enter the path to the libcs.lib file on its own separate line. Any other .lib files you
      need to add should also go on their own separate line. If people besides you will need to compile this, use the Macros to specify whichever portion of the path is likely to be different on their computers.
    9. When all .lib files have been entered, click the «OK» button to close the «Additional Dependencies» window. If you are changing the configuration and platform combinations one-by-one, click Apply if it is not grayed-out. Then switch to the next combination
      and return to step 6.
    10. When you have finished (either because you could set everything at once or because you went through and set the correct values for each combination of platforms and configurations) you should click the «OK» button in the project’s Property Pages window
      to close it.

    As far as which folder the .lib file should go in, if you include it using the link library dependencies method then you can put it in any folder you want just so long as you specify the correct path to it in step 8 above.

    It’s usually a good idea to put it in the directory that your project is in or one of the subdirectories in there (but not one that is used for output from the compiler such as the «debug» directory since it might get overwritten or accidentally deleted
    if it is in one of those directories). That way you can use the Macros mentioned in step 8 to specify the first part of the path. Usually the $(ProjectDir) macro. If it was in your project directory, then in step 8 you would just add a line that
    looked like this:

    $(ProjectDir)libcs.lib

    and that should take care of it. If there are spaces in the path, you may need to surround that line with double quotes, e.g. «$(ProjectDir)libcs.lib»

    If you try to compile it and you get a LNK1104: cannot open file ‘libcs.lib’ error that means that you didn’t specify the path correctly so you need to go back and fix it so that you either copy libcs.lib to where you told Visual Studio that it would be
    in step 8 or else change the value you set in step 8 so that it correctly points to where libcs.lib is.


    Visual C++ MVP | Website |
    Blog | @mikebmcl |
    Windows Store DirectX Game Template

    • Marked as answer by
      Jane Wang — MSFT
      Monday, February 3, 2014 6:27 AM

Содержание

  1. Ошибка средств компоновщика LNK2019
  2. Возможные причины
  3. Исходный файл, содержащий определение символа, не компилируется
  4. Файл объекта или библиотека, содержащие определение символа, не связана
  5. Объявление символа не совпадает с определением символа.
  6. Функция используется, но тип или число параметров не совпадают с определением функции.
  7. Функция или переменная объявлена, но не определена
  8. Соглашение о вызовах отличается между объявлением функции и определением функции.
  9. Символ определяется в файле C, но объявлен без использования extern «C» в файле C++.
  10. Символ определяется как static и позже ссылается за пределами файла.
  11. Член static класса не определен
  12. Зависимость сборки определяется только как зависимость проекта в решении
  13. Точка входа не определена
  14. Создание консольного приложения с помощью параметров для приложения Windows
  15. Попытка связать 64-разрядные библиотеки с 32-разрядным кодом или 32-разрядными библиотеками с 64-разрядным кодом
  16. Для встраивание функций в разные исходные файлы используются различные параметры компилятора.
  17. Автоматические переменные используются вне их области
  18. Вы вызываете встроенные функции или передаете типы аргументов в встроенные функции, которые не поддерживаются в целевой архитектуре.
  19. Вы смешиваете код, который использует машинный wchar_t код с кодом, который не используется
  20. При связывании устаревшей библиотеки static возникают ошибки *printf* и *scanf* функции.
  21. Проблемы со сторонними библиотеками и vcpkg
  22. Средства диагностики
  23. Примеры
  24. Символ объявлен, но не определен
  25. Элемент static данных объявлен, но не определен
  26. Параметры объявления не соответствуют определению
  27. Несогласованные wchar_t определения типов
  28. См. также раздел
  29. Name already in use
  30. cpp-docs / docs / error-messages / tool-errors / linker-tools-error-lnk2019.md

Ошибка средств компоновщика LNK2019

неразрешенный externсимвол al «symbol«, на который ссылается функция «function«

Скомпилированный код для функции создает ссылку или вызов символа, но компоновщик не может найти определение символа ни в одной из библиотек или файлов объектов.

За этим сообщением об ошибке следует неустранимая ошибка LNK1120. Чтобы устранить ошибку LNK1120, сначала необходимо исправить все ошибки LNK2001 и LNK2019.

Возможные причины

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

Ниже приведены некоторые распространенные проблемы, вызывающие ошибку LNK2019.

Исходный файл, содержащий определение символа, не компилируется

В Visual Studio убедитесь, что исходный файл, определяющий символ, компилируется как часть проекта. Проверьте выходной каталог промежуточной сборки на наличие соответствующего OBJ-файла. Если исходный файл не компилируется, щелкните его правой кнопкой мыши в Обозреватель решений и выберите пункт «Свойства«, чтобы проверить свойства файла. На странице«Общиесвойства> конфигурации» должен отображаться тип элементакомпилятора C/C++. В командной строке убедитесь, что исходный файл, содержащий определение, компилируется.

Файл объекта или библиотека, содержащие определение символа, не связана

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

Объявление символа не совпадает с определением символа.

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

Функция используется, но тип или число параметров не совпадают с определением функции.

Объявление функции должно соответствовать определению. Убедитесь, что вызов функции соответствует объявлению и что объявление соответствует определению. Код, вызывающий шаблоны функций, также должен иметь соответствующие объявления шаблонов функций, которые включают те же параметры шаблона, что и определение. Пример несоответствия объявления шаблона см. в примере LNK2019e.cpp в разделе «Примеры».

Функция или переменная объявлена, но не определена

LNK2019 может возникать, если объявление существует в файле заголовка, но не реализовано соответствующее определение. Для функций-членов или static членов данных реализация должна включать селектор области класса. Пример см. в разделе Missing Function Body or Variable.

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

Некоторые соглашения о вызовах ( __cdecl , __stdcall , __fastcall и __vectorcall ) кодируются как часть декорированного имени. Убедитесь, что соглашение о вызовах совпадает.

Символ определяется в файле C, но объявлен без использования extern «C» в файле C++.

Файл, скомпилированный как C, создает декорированные имена для символов, отличающихся от украшенных имен для тех же символов, объявленных в файле C++, если не используется extern «C» модификатор. Убедитесь, что объявление соответствует компоновке компиляции для каждого символа. Аналогично, если символ определяется в файле C++, который будет использоваться программой C, в определении следует использовать extern «C» .

Символ определяется как static и позже ссылается за пределами файла.

В C++ в отличие от C глобальные constмуравьи имеют static компоновку. Чтобы обойти это ограничение, можно включить const инициализации в файл заголовка и включить этот заголовок в CPP-файлыconst или сделать переменную неантой и использовать constссылку на муравей для доступа к ней.

Член static класса не определен

Член static класса должен иметь уникальное определение или нарушать правило одноопределенного определения. Член static класса, который не может быть определен как встроенный, должен быть определен в одном исходном файле с помощью полного имени. Если он не определен вообще, компоновщик создает LNK2019.

Зависимость сборки определяется только как зависимость проекта в решении

В более ранних версиях Visual Studio этот уровень зависимости был достаточным. Тем не менее, начиная с Visual Studio 2010, Visual Studio требует ссылки на проект в проект. Если у проекта нет ссылки на проект в проект, может появиться эта ошибка компоновщика. Чтобы устранить ошибку, добавьте ссылку одного проекта на другой.

Точка входа не определена

Код приложения должен определить соответствующую точку входа: main для wmain консольных приложений, а также WinMain wWinMain для приложений Windows. Дополнительные сведения см. в описании main аргументов WinMain или функций командной строки. Чтобы использовать пользовательскую точку входа, укажите параметр компоновщика (символ точки входа). /ENTRY

Создание консольного приложения с помощью параметров для приложения Windows

Если сообщение об ошибке похоже на неразрешенный externсимвол WinMain al, на который ссылается функцияfunction_name, ссылка используется /SUBSYSTEM:CONSOLE вместо /SUBSYSTEM:WINDOWS . Дополнительные сведения об этом параметре и инструкции по настройке этого свойства в Visual Studio см. в разделе /SUBSYSTEM (Указание подсистемы).

Попытка связать 64-разрядные библиотеки с 32-разрядным кодом или 32-разрядными библиотеками с 64-разрядным кодом

Библиотеки и файлы объектов, связанные с кодом, должны быть скомпилированы для той же архитектуры, что и код. Убедитесь, что библиотеки, на которые ссылается проект, компилируются для той же архитектуры, что и проект. Убедитесь, /LIBPATH что свойство или дополнительные каталоги библиотек указывают на библиотеки, созданные для правильной архитектуры.

Для встраивание функций в разные исходные файлы используются различные параметры компилятора.

Использование встроенных функций, определенных в CPP-файлах, и смешение в различных исходных файлах параметров компилятора для встраивания функций может привести к возникновению ошибки LNK2019. Для получения дополнительной информации см. Function Inlining Problems.

Автоматические переменные используются вне их области

Автоматические переменные (области видимости функции) могут использоваться только в области видимости данной функции. Эти переменные не могут объявляться extern и использоваться в других исходных файлах. Пример см. в разделе Automatic (Function Scope) Variables.

Вы вызываете встроенные функции или передаете типы аргументов в встроенные функции, которые не поддерживаются в целевой архитектуре.

Например, если вы используете встроенную AVX2 функцию, но не указываете /ARCH:AVX2 параметр компилятора, компилятор предполагает, что встроенная функция al extern. Вместо создания встроенной инструкции компилятор создает вызов externсимвола al с тем же именем, что и встроенная инструкция. Когда компоновщик пытается найти определение этой отсутствующей функции, он создает ошибку LNK2019. Убедитесь, что используются только встроенные и типы, поддерживаемые целевой архитектурой.

Вы смешиваете код, который использует машинный wchar_t код с кодом, который не используется

Работа по соответствию языкаМ C++, выполненная в Visual Studio 2005, по умолчанию сделала wchar_t собственный тип. Если не все файлы были скомпилированы с помощью одних и того же /Zc:wchar_t параметра, ссылки на типы могут не разрешаться в совместимые типы. Убедитесь, что wchar_t типы во всех библиотеках и файлах объектов совместимы. Обновление из wchar_t typedef или использование согласованных параметров /Zc:wchar_t при компиляции.

При связывании устаревшей библиотеки static возникают ошибки *printf* и *scanf* функции.

Библиотека static , созданная с помощью версии Visual Studio до Visual Studio 2015, может привести к ошибкам LNK2019 при связывании с UCRT. Файлы заголовков UCRT и теперь определяют многие *printf* варианты как *scanf* inline функции. Встроенные функции реализуются небольшим набором общих функций. Отдельные экспорты встроенных функций недоступны в стандартных библиотеках UCRT, которые экспортируют только общие функции. Существует несколько способов решения этой проблемы. Рекомендуется перестроить устаревшую библиотеку с текущей версией Visual Studio. Убедитесь, что код библиотеки использует стандартные заголовки для определений *printf* и *scanf* функций, вызвавших ошибки. Еще один вариант для устаревшей библиотеки, которую нельзя перестроить, — добавить legacy_stdio_definitions.lib в список библиотек, которые вы связываете. Этот файл библиотеки предоставляет символы и *printf* *scanf* функции, которые встраиваются в заголовки UCRT. Дополнительные сведения см. в разделе «Библиотеки » статьи «Общие сведения о потенциальных проблемах обновления».

Проблемы со сторонними библиотеками и vcpkg

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

Средства диагностики

Иногда трудно определить, почему компоновщик не может найти определенное определение символа. Часто проблема заключается в том, что вы не включили код, содержащий определение в сборке. Кроме того, варианты сборки создали разные декорированные имена для externсимволов al. Существует несколько средств и вариантов, которые помогут диагностировать ошибки LNK2019.

Параметр /VERBOSE компоновщика поможет определить файлы ссылок компоновщика. Этот параметр поможет проверить, включен ли файл, содержащий определение символа, в сборку.

Служебная /EXPORTS DUMPBIN программа позволяет /SYMBOLS определить, какие символы определены в файлах .dll и объектов или библиотек. Убедитесь, что экспортированные имена совпадают с декорированными именами, которые выполняет поиск компоновщика.

Служебная UNDNAME программа может показать эквивалентный неоцененный externсимвол al для украшенного имени.

Примеры

Ниже приведено несколько примеров кода, вызывающих ошибки LNK2019, а также сведения об устранении ошибок.

Символ объявлен, но не определен

В этом примере переменная al объявлена extern, но не определена:

Ниже приведен еще один пример объявления переменной и функции, но extern не предоставляется определение:

Если i и g не определены в одном из файлов, включенных в сборку, компоновщик создает LNK2019. Чтобы исправить ошибки, включите файл исходного кода, который содержит определения, в процесс компиляции. Кроме того, можно передать .obj файлы или .lib файлы, содержащие определения компоновщика.

Элемент static данных объявлен, но не определен

LNK2019 также может возникать, когда static член данных объявлен, но не определен. В следующем примере показано возникновение ошибки LNK2019 и приводятся сведения по ее устранению.

Параметры объявления не соответствуют определению

Код, вызывающий шаблоны функций, должен иметь соответствующие объявления шаблонов функций. Объявления должны содержать те же параметры шаблона, что и определение. В следующем примере показано возникновение ошибки LNK2019 для определяемого пользователем оператора и приводятся сведения по ее устранению.

Несогласованные wchar_t определения типов

В этом примере создается библиотека DLL с экспортом, который использует WCHAR , который разрешается wchar_t в .

Следующий пример использует библиотеку DLL в предыдущем примере и создает LNK2019, так как типы unsigned short* и WCHAR* не совпадают.

Чтобы устранить эту ошибку, измените unsigned short wchar_t WCHAR или скомпилируйте LNK2019g.cpp с помощью . /Zc:wchar_t-

См. также раздел

Дополнительные сведения о возможных причинах и решениях ошибок LNK2019, LNK2001 и LNK1120 см. в вопросе Stack Overflow: What is an undefined reference/unresolved external symbol error and how do I fix it?

Источник

Name already in use

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink

Copy raw contents

Copy raw contents

Linker Tools Error LNK2019

unresolved external symbol ‘symbol‘ referenced in function ‘function

The compiled code for function makes a reference or call to symbol, but the linker can’t find the symbol definition in any of the libraries or object files.

This error message is followed by fatal error LNK1120. To fix error LNK1120, you must fix all LNK2001 and LNK2019 errors first.

There are many ways to get this error. All of them involve a reference to a function or variable that the linker couldn’t resolve, or find a definition for. The compiler can identify when a symbol isn’t declared, but it can’t tell when the symbol isn’t defined. It’s because the definition may be in a different source file or library. If a symbol is referred to but never defined, the linker generates an unresolved external symbol error.

Here are some common problems that cause LNK2019:

The source file that contains the definition of the symbol isn’t compiled

In Visual Studio, make sure the source file that defines the symbol gets compiled as part of your project. Check the intermediate build output directory for a matching .obj file. If the source file isn’t compiled, right-click on the file in Solution Explorer, and then choose Properties to check the properties of the file. The Configuration Properties > General page should show an Item Type of C/C++ Compiler. On the command line, make sure the source file that contains the definition is compiled.

The object file or library that contains the definition of the symbol isn’t linked

In Visual Studio, make sure the object file or library that contains the symbol definition is linked as part of your project. On the command line, make sure the list of files to link includes the object file or library.

The declaration of the symbol isn’t spelled the same as the definition of the symbol

Verify you use the correct spelling and capitalization in both the declaration and the definition, and wherever the symbol is used or called.

A function is used but the type or number of the parameters don’t match the function definition

The function declaration must match the definition. Make sure the function call matches the declaration, and that the declaration matches the definition. Code that invokes function templates must also have matching function template declarations that include the same template parameters as the definition. For an example of a template declaration mismatch, see sample LNK2019e.cpp in the Examples section.

A function or variable is declared but not defined

LNK2019 can occur when a declaration exists in a header file, but no matching definition is implemented. For member functions or static data members, the implementation must include the class scope selector. For an example, see Missing Function Body or Variable.

The calling convention is different between the function declaration and the function definition

Some calling conventions ( __cdecl , __stdcall , __fastcall , and __vectorcall ) are encoded as part of the decorated name. Make sure the calling convention is the same.

A symbol is defined in a C file, but declared without using extern «C» in a C++ file

A file that’s compiled as C creates decorated names for symbols that are different from the decorated names for the same symbols declared in a C++ file, unless you use an extern «C» modifier. Make sure the declaration matches the compilation linkage for each symbol. Similarly, if you define a symbol in a C++ file that will be used by a C program, use extern «C» in the definition.

A symbol is defined as static and then later referenced outside the file

In C++, unlike C, global constants have static linkage. To get around this limitation, you can include the const initializations in a header file and include that header in your .cpp files, or you can make the variable non-constant and use a constant reference to access it.

A static member of a class isn’t defined

A static class member must have a unique definition, or it will violate the one-definition rule. A static class member that can’t be defined inline must be defined in one source file by using its fully qualified name. If it isn’t defined at all, the linker generates LNK2019.

A build dependency is only defined as a project dependency in the solution

In earlier versions of Visual Studio, this level of dependency was sufficient. However, starting with Visual Studio 2010, Visual Studio requires a project-to-project reference. If your project doesn’t have a project-to-project reference, you may receive this linker error. Add a project-to-project reference to fix it.

An entry point isn’t defined

The application code must define an appropriate entry point: main or wmain for console applications, and WinMain or wWinMain for Windows applications. For more information, see main function and command-line arguments or WinMain function. To use a custom entry point, specify the /ENTRY (Entry-Point Symbol) linker option.

You build a console application by using settings for a Windows application

If the error message is similar to unresolved external symbol WinMain referenced in function function_name, link by using /SUBSYSTEM:CONSOLE instead of /SUBSYSTEM:WINDOWS . For more information about this setting, and for instructions on how to set this property in Visual Studio, see /SUBSYSTEM (Specify Subsystem).

You attempt to link 64-bit libraries to 32-bit code, or 32-bit libraries to 64-bit code

Libraries and object files linked to your code must be compiled for the same architecture as your code. Make sure the libraries your project references are compiled for the same architecture as your project. Make sure the /LIBPATH or Additional Library Directories property points to libraries built for the correct architecture.

You use different compiler options for function inlining in different source files

Using inlined functions defined in .cpp files and mixing function inlining compiler options in different source files can cause LNK2019. For more information, see Function Inlining Problems.

You use automatic variables outside their scope

Automatic (function scope) variables can only be used in the scope of that function. These variables can’t be declared extern and used in other source files. For an example, see Automatic (Function Scope) Variables.

You call intrinsic functions or pass argument types to intrinsic functions that aren’t supported on your target architecture

For example, if you use an AVX2 intrinsic, but don’t specify the /ARCH:AVX2 compiler option, the compiler assumes that the intrinsic is an external function. Instead of generating an inline instruction, the compiler generates a call to an external symbol with the same name as the intrinsic. When the linker tries to find the definition of this missing function, it generates LNK2019. Make sure you only use intrinsics and types supported by your target architecture.

You mix code that uses native wchar_t with code that doesn’t

C++ language conformance work that was done in Visual Studio 2005 made wchar_t a native type by default. If not all files have been compiled by using the same /Zc:wchar_t settings, type references may not resolve to compatible types. Make sure wchar_t types in all library and object files are compatible. Either update from a wchar_t typedef, or use consistent /Zc:wchar_t settings when you compile.

You get errors for *printf* and *scanf* functions when you link a legacy static library

A static library that was built using a version of Visual Studio before Visual Studio 2015 may cause LNK2019 errors when linked with the UCRT. The UCRT header files , , and now define many *printf* and *scanf* variations as inline functions. The inlined functions are implemented by a smaller set of common functions. Individual exports for the inlined functions aren’t available in the standard UCRT libraries, which only export the common functions. There are a couple of ways to resolve this issue. The method we recommend is to rebuild the legacy library with your current version of Visual Studio. Make sure the library code uses the standard headers for the definitions of the *printf* and *scanf* functions that caused the errors. Another option for a legacy library that you can’t rebuild is to add legacy_stdio_definitions.lib to the list of libraries you link. This library file provides symbols for the *printf* and *scanf* functions that are inlined in the UCRT headers. For more information, see the Libraries section in Overview of potential upgrade issues.

Third-party library issues and vcpkg

If you see this error when you’re trying to configure a third-party library as part of your build, consider using vcpkg. vcpkg is a C++ package manager that uses your existing Visual Studio tools to install and build the library. vcpkg supports a large and growing list of third-party libraries. It sets all the configuration properties and dependencies required for successful builds as part of your project.

Sometimes it’s difficult to tell why the linker can’t find a particular symbol definition. Often the problem is that you haven’t included the code that contains the definition in your build. Or, build options have created different decorated names for external symbols. There are several tools and options that can help you diagnose LNK2019 errors.

The /VERBOSE linker option can help you determine which files the linker references. This option can help you verify whether the file that contains the definition of the symbol is included in your build.

The /EXPORTS and /SYMBOLS options of the DUMPBIN utility can help you discover which symbols are defined in your .dll and object or library files. Make sure the exported decorated names match the decorated names the linker searches for.

The UNDNAME utility can show you the equivalent undecorated external symbol for a decorated name.

Here are several examples of code that causes LNK2019 errors, together with information about how to fix the errors.

A symbol is declared but not defined

In this example, an external variable is declared but not defined:

Here’s another example where a variable and function are declared as extern but no definition is provided:

Unless i and g are defined in one of the files included in the build, the linker generates LNK2019. You can fix the errors by including the source code file that contains the definitions as part of the compilation. Alternatively, you can pass .obj files or .lib files that contain the definitions to the linker.

A static data member is declared but not defined

LNK2019 can also occur when a static data member is declared but not defined. The following sample generates LNK2019, and shows how to fix it.

Declaration parameters don’t match the definition

Code that invokes function templates must have matching function template declarations. Declarations must include the same template parameters as the definition. The following sample generates LNK2019 on a user-defined operator, and shows how to fix it.

Inconsistent wchar_t type definitions

This sample creates a DLL that has an export that uses WCHAR , which resolves to wchar_t .

The next sample uses the DLL in the previous sample, and generates LNK2019 because the types unsigned short* and WCHAR* aren’t the same.

To fix this error, change unsigned short to wchar_t or WCHAR , or compile LNK2019g.cpp by using /Zc:wchar_t- .

For more information about possible causes and solutions for LNK2019, LNK2001, and LNK1120 errors, see the Stack Overflow question: What is an undefined reference/unresolved external symbol error and how do I fix it? .

Источник

  1. В общем, я не знаю что произошло, но у меня вдруг перестала работать опция /I (путь к include-файлам) в ml. Раньше всё работало, теперь выдаёт ошибку типа такого:

    1. pe.asm(8) : fatal error A1000: cannot open file : WINDOWS.INC

    В исходнике указано имя файла без пути:

    Файл этот точно есть и точно по указанному пути.
    Если установить переменную окружения INCLUDE=этому пути или задать полный путь в исходнике, всё ок.

    Но это ещё не всё. Линкер тоже выдаёт (даже если прописать в исходнике полные пути к lib’ам):

    1. D:pe.obj : warning LNK4033: converting object format from OMF to COFF
    2. pe.obj : error LNK2001: unresolved external symbol _ExitProcess@4
    3. LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
    4. pe.exe : fatal error LNK1120: 2 unresolved externals

    Т.е. ощущение, что не только /I перестал работать, но и /coff, например. Да и lib’ы почему-то не линкуются, судя по всему…

    Переустановка masm32 не помогает…
    Пробовал подменить даже содержимое папки bin (версия 6.14) файлами версии 6.11 (скачанной из инета) — та же ерунда.

    Т.е. проблема явно не в компиляторе самом, а в чём — ума не приложу! Загадка какая-то!

    Понимаю, что инфы мало, но даже не знаю что ещё сообщить. Всё, что было сделано (перед тем, как проблема появилась) — это компиляция пары исходников через ml64. Попытка установить MASMsetup.EXE, скачанный с сайта Microsoft (но вышла ошибка «MS Visual C++ Express Edition 2005 required» и забил это). Ну ещё я случайно скопировал несколько *.lib-файлов для 64 бит в папку lib для 32 бит (без замены, но потом удалил эти файлы). Обновление Notepad ++ я уж не беру в расчёт. Но в любом случай, повторюсь, masm32 (скачанный с masm32.com) я переустанавливал!

    Что делать?
    Может, кто-то сталкивался с этим уже?

    p.s. Исходник пустой:

    Последнее редактирование: 8 апр 2017


  2. Indy_

    Indy_

    Well-Known Member

    Публикаций:

    4

    Регистрация:
    29 апр 2011
    Сообщения:
    4.780

    Пути пропишите. И версию смените компиля между прочим.

    Вложения:

    • ml.zip
      Размер файла:
      169,5 КБ
      Просмотров:
      669
  3. Indy_, спасибо, заработало.
    Но! У меня несколько (хочется даже сказать «пару») дней назад стоял ml 6.14 и всё работало. И пути я не прописывал!
    Как это можно понять?


  4. Indy_

    Indy_

    Well-Known Member

    Публикаций:

    4

    Регистрация:
    29 апр 2011
    Сообщения:
    4.780

    Jin X,

    Причин множество может быть, может авер или есчо какой софт мешает, может что то заразило систему или обновления.


WASM

На чтение 3 мин. Просмотров 75 Опубликовано 15.12.2019

число неразрешенных внешних идентификаторов number unresolved externals

Error LNK1120 сообщает количество неразрешенных ошибок внешних символов в текущей ссылке. Error LNK1120 reports the number of unresolved external symbol errors in the current link.

Каждый неразрешенный внешний символ сначала получает сообщение об ошибке LNK2001 или LNK2019 . Each unresolved external symbol first gets reported by a LNK2001 or LNK2019 error. Сообщение LNK1120 поступает последним и показывает количество ошибок неразрешенного символа. The LNK1120 message comes last, and shows the unresolved symbol error count.

Устранить эту ошибку не нужно. You don’t need to fix this error. Эта ошибка исчезает, когда вы исправляете все ошибки компоновщика LNK2001 и LNK2019 до того, как они попадают в выходные данные сборки. This error goes away when you correct all of the LNK2001 and LNK2019 linker errors before it in the build output. Всегда устранять проблемы, начиная с первой ошибки, о которой сообщается. Always fix issues starting at the first reported error. Более поздние ошибки могут быть вызваны более ранними версиями и исчезнуть при исправлении предыдущих ошибок. Later errors may be caused by earlier ones, and go away when the earlier errors are fixed.

При компиляции программы ошибок не вылетает. значит в коде ошибок нет. Но при попытке создания экзешника студия показывает 2 ошибки:

1. error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

2. fatal error LNK1120: 1 unresolved externals

При работе с кодом на другой машине, нареканий у программы не возникает.

Напишите, пожалуйста, что необходимо сделать чтобы студия работала нормально (поподробнее для чайника) . И если нетрудно, опишите причины возникновения ошибок.

What is causing this error? I google’d it and first few solutions I found were that something was wrong with the library and the main function but both seem to be fine in my problem, I even retyped both! What could be causing this?

This might be helpful:

MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol WinMain@16 referenced in function __tmainCRTStartup

7 Answers 7

When you created the project, you made the wrong choice of application type. When asked whether your project was a console application or a windows application or a DLL or a static library, you made the wrong chose windows application (wrong choice).

Go back, start over again, go to File -> New -> Project -> Win32 Console Application -> name your app -> click next -> click application settings.

For the application type, make sure Console Application is selected (this step is the vital step).

The main for a windows application is called WinMain, for a DLL is called DllMain, for a .NET application is called Main(cli::array ^), and a static library doesn’t have a main. Only in a console app is main called main

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Fatal error lnk1113 invalid machine type
  • Fatal error lnk1112 тип компьютера модуля x64 противоречит типу целевого компьютера x86
  • Fatal error lnk1112 module machine type x86 conflicts with target machine type x64
  • Fatal error lnk1107
  • Fatal error lnk1105 не удается закрыть файл

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии