Error LKN:2019..无法解析的外部命令..........

2023-11-10 17:59

本文主要是介绍Error LKN:2019..无法解析的外部命令..........,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 LNK2001无法解析的外部符号“symbol”收藏
可能的原因    
   
  代码请求的内容不存在(例如,符号拼写错误或使用错误的大小写)。    
  代码请求的内容错误(使用的是混合版本的库,一些库来自产品的一个版本,而其他则来自另一个版本)。    
  该错误信息之后为致命错误   LNK1120。  
   
  具体原因  
   
  代码问题    
   
  如果   LNK2001   诊断文本报告   __check_commonlanguageruntime_version   是无法解析的外部符号,可参见   LNK2019   了解如何解决该问题的信息。    
  成员模板的定义超出了类的范围。Visual   C++   的一个限制是,成员模板的定义必须完全位于封闭类内。有关   LNK2001   和成员模板的更多信息,请参见知识库文章   Q239436。    
  代码或模块定义   (.def)   文件中的大小写不匹配会导致   LNK2001。例如,当在一个   C++   源文件中将一个变量命名为   var1,并试图在另一个源文件中以   VAR1   访问该变量时。    
  如果项目使用函数内联,但在   .cpp   文件而非头文件中定义函数,则会导致   LNK2001。    
  从   C++   程序调用   C   函数但不使用   extern   "C"(这导致编译器使用   C   命名约定)会导致   LNK2001。编译器选项   /Tp   和   /Tc   使编译器将文件分别编译为   C   或   C++,与文件扩展名无关。这些选项会导致函数名与您所期望的名称不同。    
  试图引用没有外部链接的函数或数据会导致   LNK2001。在   C++   中,内联函数和   const   数据具有内部链接,除非被显式指定为   extern。    
  缺少函数主体或变量会导致   LNK2001。如果只有函数原型或   extern   声明,编译器继续运行而不会出现任何错误,但由于没有保留函数代码或变量空间,链接器将无法解析地址调用或变量引用。    
  调用参数类型与函数声明中的参数类型不匹配的函数会导致   LNK2001。名称修饰将函数参数合并到最终的修饰函数名中。    
  错误包含的原型导致编译器需要没有提供的函数体,这样会导致   LNK2001。如果同时具有函数   F   的类实现和非类实现,请注意   C++   范围解析规则。    
  在使用   C++   时,将函数原型包含在类定义中但未能包含实现(该类的此函数的实现)会导致   LNK2001。    
  试图从抽象基类的构造函数或析构函数调用纯虚函数会导致   LNK2001。纯虚函数没有基类实现。    
  试图从包含静态变量声明的文件外部访问该静态变量会导致   LNK2001。根据定义,用   Static   修饰符声明的函数具有文件范围。静态变量具有相同的限制。    
  试图在函数范围外使用用该函数声明的变量(局部变量)会导致   LNK2001。    
  试图在多个文件中使用   C++   全局常数会导致   LNK2001。与   C   不同,在   C++   中全局常数具有   static   链接。若要避免此限制,可以将   const   初始化包括在头文件中,并将此头包括在   .cpp   文件中,也可以使变量成为非常数,然后使用常数引用访问它。    
  在生成   ATL   项目的发布版本时,指示需要   CRT   启动代码。若要修复,请执行下列操作之一:    
  将   _ATL_MIN_CRT   从预处理器定义列表中移除,以允许包括   CRT   启动代码。有关更多信息,请参见常规配置设置属性页。    
  如果可能,移除对需要   CRT   启动代码的   CRT   函数的调用,而是使用它们的   Win32   等效函数。例如,使用   lstrcmp   取代   strcmp。需要   CRT   启动代码的已知函数是一些字符串和浮点函数。    
  编译和链接问题    
   
  项目缺少对库   (.LIB)   或对象   (.OBJ)   文件的引用。有关更多信息,请参见用作链接器输入的   .lib   文件。    
  当运行时库和   MFC   库的名称包含在对象文件模块中时使用   /NOD   会导致   LNK2001。如果使用   /NOD   (/NODEFAULTLIB)   选项,这些库将不会链接到项目中,除非显式包含了它们。    
  使用   Unicode   和   MFC   时,如果没有创建   wWinMainCRTStartup   的入口点,将在   _WinMain@16   上得到无法解析的外部对象;请使用   /ENTRY。请参见   Unicode   编程摘要。    
  有关更多信息,请参见下列位于   MSDN   Library   中的知识库文章。在   MSDN   Library   中,单击“搜索”选项卡,将文章编号或文章标题粘贴在文本框中,然后单击“列出主题”。如果按文章编号搜索,确保清除“仅搜索标题”选项。    
   
  Q125750       “PRB:   Error   LNK2001:   '_WinMain@16':   Unresolved   External   Symbol”    
  Q131204       “PRB:   Wrong   Project   Selection   Causes   LNK2001   on   _WinMain@16”    
  Q100639       “Unicode   Support   in   the   Microsoft   Foundation   Class   Library”    
  Q291952         “PRB:   Link   Error   LNK2001:   Unresolved   External   Symbol   _main”    
  将用   /MT   编译的代码与库   LIBC.lib   链接会在   _beginthread、_beginthreadex、_endthread   和   _endthreadex   上导致   LNK2001。    
  链接需要多线程库的代码(任何   MFC   代码或用   /MT   编译的代码)会在   _beginthread、_beginthreadex、_endthread   和   _endthreadex   上导致   LNK2001。有关更多信息,请参见下列知识库文章:    
  Q126646“PRB:   Error   Msg:   LNK2001   on   __beginthreadex   and   __endthreadex”    
  Q128641“INFO:   /Mx   Compiler   Options   and   the   LIBC,   LIBCMT,   MSVCRT   Libs”    
  Q166504“PRB:   MFC   and   CRT   Must   Match   in   debug/release   and   static/dynamic”    
  在用   /MD   进行编译时,因为所有的运行库现在都存放在   DLL   中,所以源中的“func”引用在对象中变为“__imp__func”引用。如果试图与静态库   LIBC.lib   或   LIBCMT.lib   链接,则将在   __imp__func   上得到   LNK2001。当不用   /MD   进行编译时,如果试图与   MSVCxx.lib   链接,则并非总是得到   LNK2001,但可能会有其他问题。    
  将用显式或隐式   /ML   编译的代码链接到   LIBCMT.lib   时将在   _errno   上导致   LNK2001。    
  在生成应用程序的调试版本时与发布模式库链接会导致   LNK2001。同样,使用   /Mxd   选项(/MLd、/MTd   或   /MDd)并/或定义   _DEBUG,然后与发布库链接将带来潜在的无法解析的外部对象(以及其他问题)。将发布模式生成与调试库链接同样会导致类似问题。    
  将   Microsoft   库版本和编译器产品版本混合可能会有问题。新编译器版本的库可能包含早期版本的库中没有的新符号。可能需要更改搜索路径中的目录顺序,或将它们更改为指向当前版本。    
  通过库文件选择下的“工具”   |   “选项”   |   “项目”   |   “VC++   目录”对话框,您可以更改搜索顺序。项目的“属性页”对话框中的“链接器”文件夹可能也包含可能已过期的路径。    
   
  当安装了新的   SDK(可能在不同的位置),但没有将搜索顺序更新为指向新位置时,可能会出现此问题。通常情况下,应将新   SDK   的   include   目录和   lib   目录的路径放在默认   Visual   C++   位置的前面。另外,包含嵌入路径的项目可能仍然指向旧路径,这些路径是有效的,但对于安装到不同位置的新版本所添加的新功能已过期。    
   
  编译器供应商之间、甚至同一编译器的不同版本之间当前没有   C++   命名标准。因此,链接用其他编译器编译的对象文件可能无法生成相同的命名方案,从而导致错误   LNK2001。    
  在不同模块上混合内联和非内联编译选项会导致   LNK2001。如果创建   C++   库时打开了函数内联(/Ob1   或   /Ob2),但描述函数的相应头文件的内联是关闭的(没有   inline   关键字),将发生此错误。若要防止此问题,请在要包含到其他文件中的头文件中用   inline   定义内联函数。    
  如果使用   #pragma   inline_depth   编译器指令,请确保具有设置为   2   或更大的值,并确保使用   /Ob1   或   /Ob2   编译器选项。    
  在创建纯资源   DLL   时省略   LINK   选项   /NOENTRY   将导致   LNK2001。    
  使用不正确的   /SUBSYSTEM   或   /ENTRY   设置会导致   LNK2001。例如,如果编写基于字符的应用程序(控制台应用程序)并指定   /SUBSYSTEM:WINDOWS,您将得到无法解析的   WinMain   外部对象。有关这些选项和入口点的更多信息,请参见   /SUBSYSTEM   和   /ENTRY   链接器选项。    
  创建的项目是一个托管   DLL,它包含的   Microsoft   中间语言代码没有链接到本机   C/C++   库(如   CRT、ATL   或   MFC),而您是从使用静态变量的本机   C/C++   库添加代码。若要修复,必须将该项目转换为混合模式。有关更多信息,请参见将   C++   托管扩展项目从纯中间语言转换为混合模式。    
  导出问题    
   
  当将应用程序从   16   位移植到   32   位时,会发生   LNK2001。当前的   32   位模块定义   (.def)   文件语法要求   __cdecl、__stdcall   和   __fastcall   函数列在   EXPORTS   节中,并且不带下划线(不修饰)。这不同于   16   位语法,这些函数在   16   位语法中列出时必须带下划线(修饰)。有关更多信息,请参见模块定义文件   EXPORTS   节的说明。    
  在   .def   文件中列出但未找到的任何导出将导致   LNK2001。这可能是因为导出不存在、拼写错误或使用了   C++   修饰名(.def   文件不采用修饰名)。    
  解释输出  
   
  如果符号无法解析,通过下列指南可获得有关函数的信息:  
   
  在   x86   平台上,用   C   编译的名称或   C++   中的   extern   "C"   名称的调用约定修饰是:    
   
  __cdecl    
  函数具有下划线   (_)   前缀。    
  __stdcall    
  函数具有下划线   (_)   前缀和   @   后缀,后跟堆栈上参数的双倍字长对齐大小。    
  __fastcall    
  函数具有   @   前缀和   @   后缀,后跟堆栈上参数的双倍字长对齐大小。    
  使用   undname.exe   获取修饰名的未修饰格式。  
   
  有关上面列出的某些原因的更多信息,请参见:    
   
  缺少函数主体或变量    
  名称修饰    
  该符号不是公共的    
  自动(函数范围)变量    
  C++   中的全局常数    
  函数内联问题  

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/nova_nwu/archive/2008/11/10/3266376.aspx

 

 

 

 

 

 

P.S:

一般来说后边还有一个,

faltal error lnk 1120 : 错误。

从LNK2019错误的位置(.obj)来看是源文件出错误的可能性比较大,因为在文件到.obj的时候单纯的就是名字解析。或者是名字C++/C化。然后才是LINK。所以仔细检查你的源文件。重要的就是一些固定生成的东西。自己定义的函数或者其他的出先这个错误的肯能性比较底。

 

这篇关于Error LKN:2019..无法解析的外部命令..........的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/384350

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.