unresolved external symbol 'symbol' referenced in function 'function'
An undefined external symbol (symbol) was found in function. To resolve this error, provide a definition for symbol or remove the code that references it.
In Visual C++ .NET 2003, this error will be generated when /clris used and the CRT is not linked into your executable. Any object code generated by the compiler that is not built with /clr:initialAppDomain contains a reference to the _check_commonlanguageruntime_version function, which is defined in the C Runtime Library (CRT). This function provides for an error message if your application is run on version 1 of the runtime. Code generated by the current compiler is not compatible with version 1 of the common language runtime. So, if you compile without the CRT in Visual C++ .NET 2003, you should include a definition of the _check_commonlanguageruntime_version function in your code. As an alternative to using the _check_commonlanguageruntime_version function, you can link with nochkclr.obj, which contains an empty version of the function and does not provide for an error message if you run your application on version 1 of the runtime. To build an application with the current compiler version to run on the previous version of the runtime, use /clr:InitialAppDomain.
To build a pure MSIL executable (does not link with the CRT), you must define the function in your project; you cannot use nochkclr.obj (the .obj is native code). See Producing Verifiable Components with Managed Extensions for C++for more information about verifiable code. For more information on creating a pure MSIL output file from your Managed C++ project, see Converting Managed Extensions for C++ Projects from Mixed-Mode to Pure IL.
The rest of this topic discusses other causes of LNK2019.
Consider the following sample:
extern int i; extern void g(); void f() { i++; g(); } int main() { }
If i
and g
are not defined in one of the files included in the build, the linker will generate LNK2019. These definitions can be added by including the source code file that contains the definitions as part of the compilation. Alternatively, you can pass .obj or .lib files that contain the definitions to the linker.
For C++ projects from previous releases that were upgraded to the current version, if __UNICODE was defined and the entry point was WinMain, you need to change the name of the entry point function to either _tWinMain or _tmain.
Common problems that cause LNK2019 include:
extern int i; extern void g();
use:
extern "C" int i; extern "C" void g();
Similarly, if you define a symbol in a C++ file that will be used by a C program, use extern "C"
in the definition.
si
in the class declaration below should be defined separately: #include <stdio.h> struct X { static int si; }; // int X::si = 0; // uncomment this line to resolve void main() { X *px = new X[2]; printf("\n%d",px[0].si); // LNK2019 }
This error can also be generated as a result of conformance work that was done for Visual Studio .NET 2003: template friends and specialization. In Visual Studio .NET 2003, a friend declaration that declares a new non-template function must be defined.
For code that is valid in both the Visual Studio .NET 2003 and Visual Studio .NET versions of Visual C++, explicitly specify the friend function's template argument list.
// LNK2019.cpp // LNK2019 expected template<class T> void f(T) { } template<class T> struct S { friend void f(T); // Try the folowing line instead: // friend void f<T>(T); }; int main() { S<int> s; f(1); // unresolved external }
The /VERBOSE linker option will help you see which files the linker is referencing. The /EXPORT and /SYMBOLS options of the DUMPBIN utility can also help you see which symbols are defined in your dll and object/library files.