c++unresolved external symbol,unresolved external symbol winmain

  c++unresolved external symbol,unresolved external symbol winmain

  在学习VC的时候,经常会遇到链接错误LNK2001,这是很烦人的,因为对于程序员来说,最好纠正的错误就是编译错误,而一般来说,当出现链接错误的时候,编译已经过去了。连接错误的原因有很多,尤其是LNK2001错误,经常让人疑惑为什么。如果不深入学习和理解VC,纠正连接错误LNK2001是非常困难的。

  在学习VC的过程中,初学者遇到的LNK2001错误的错误信息主要有以下几种:

  未解析的外部符号“符号”(不确定的外部“符号”)。

  如果链接器无法在所有库和目标文件中找到被引用的函数、变量或标签,则会生成此错误信息。一般来说,错误的原因有两个:一是引用的函数和变量不存在,拼写错误或使用错误;其次,可以使用不同版本的连接库。

  以下是LNK2001错误的可能原因:

  1.LNK2001由于编码错误

  1.不匹配的程序代码或模块定义(。def)文件可以导致LNK2001。例如,如果在C源文件中声明了变量“VAR1 ”,但您试图在另一个文件中使用变量“var1”来访问该变量,就会出现此错误。

  2.如果使用的内联函数在。CPP文件而不是头文件,这将导致LNK2001错误。

  3.调用函数时,如果使用的参数类型与声明函数时的类型不同,将生成LNK2001。

  4.试图从基类的构造函数或析构函数调用虚函数将导致LNK2001。

  5.注意函数和变量的共性。只有全局变量和函数可以共享。静态函数和静态变量在使用范围上有相同的限制。试图从文件外部访问文件中未声明的任何静态变量将导致编译错误或LNK2001。

  在函数中声明的变量(局部变量)只能在函数范围内使用。

  c的全局常数只有静态连接性能。与C不同,如果你试图在C的多个文件中使用全局变量,你也会得到LNK2001错误。一种解决方案是在必要时在头文件中添加常量的初始化代码,并将头文件包含在。CPP文件;另一种方法是在使用这个变量时给它赋一个常数。

  二。LNK2001由于编译和链接的设置

  1.如果在编译过程中使用/NOD(/NODEFAULTLIB)选项,程序所需的运行时和MFC库将在连接时由编译器写入目标文件模块,但这些库不会链接到项目文件中,除非这些库的名称显式包含在文件中。在这种情况下使用/NOD将导致错误LNK2001。

  2.如果没有为wWinMainCRTStartup设置程序条目,则在使用Unicode和MFC时,您将得到LNK2001错误信息“Unresolved external on _ winmain @ 16”。

  3.用/MD选项编译时,由于所有运行时库都保存在动态链接库中,所以源文件中对“func”的引用就是目标文件中对“__imp__func”的引用。如果您尝试使用静态库LIBC进行连接。LIB或LIBCMT。LIB,LNK2001将发生在_ _ imp _ _ func如果不使用/MD选项

  当MSVCxx时也会出现LNK2001。LIB用于连接。

  4.用/ML选项编译时,如果用LIBCMT链接。LIB,LNK2001将发生在_errno。

  5.编译被调试的应用程序时,LNK2001如果分布式模式库用于连接,也会产生;同样,当使用调试模式库连接分发应用程序时,也会出现同样的问题。

  6.混合使用不同版本的库和编译器也会导致问题,因为新版本的库可能包含早期版本没有的符号和描述。

  编程时打开了函数内联(/Ob1或/Ob2),但在描述函数的对应头文件中关闭了函数内联(没有inline关键字),那么就会得到这个错误信息。为了避免这个问题,内联函数应该在相应的头文件中用inline关键字标记。

  8.不正确的/SUBSYSTEM或/ENTRY设置也可能导致LNK2001。

  解决方法:

  解决外部符号错误:_main,_WinMain@16,__beginthreadex

  在创建MS-VisualC++的类库(微软基础班的缩写)项目时,不使用应用向导向导,就会在编译时产生很多连接错误,如错误LNK2001错误,典型的错误提示有:

  libcmtd.lib(crt0.obj):错误LNK2001:未解析的外部符号_main

  LIBCD.lib(wincrt0.obj):错误LNK2001:未解析的外部符号_WinMain@

  msvcrtd.lib(crtexew.obj):错误LNK2001:无法解析的外部符号_WinMain@

  nafxcwd.lib(thrdcore.obj):错误LNK2001:未解析的外部符号__beginthreadex

  nafxcwd.lib(thrdcore.obj):错误LNK2001:未解析的外部符号__endthreadex

  1.Windows操作系统操作系统子系统设置错误,提示:

  libcmtd.lib(crt0.obj):错误LNK2001:未解析的外部符号_main

  Windows操作系统操作系统项目要使用Windows操作系统操作系统子系统,而不是控制台,可以这样设置:

  [项目]-[设置]选择链接属性页,在项目选项中将/子系统:控制台改成/子系统:windows

  2.安慰子系统设置错误,提示:

  LIBCD.lib(wincrt0.obj):错误LNK2001:未解析的外部符号_WinMain@控制台项目要使用安慰子系统,而不是Windows,设置:

  [项目]-[设置]选择链接属性页

  3.程序入口设置错误,提示:

  msvcrtd.lib(crtexew.obj):错误LNK2001:无法解析的外部符号_WinMain@通常,MFC项目的程序入口函数是温梅恩,如果编译项目的统一码版本,程序入口必须改为wWinMainCRTStartup,所以需要重新设置程序入口:

  [项目]-[设置]选择链接属性页,在种类中选择输出,再在入口点符号中填入wWinMainCRTStartup,即可

  4.线程运行时库设置错误,提示:nafxcwd.lib(thrdcore.obj):错误LNK2001:未解析的外部符号__beginthreadex

  nafxcwd.lib(thrdcore.obj):错误LNK2001:未解析的外部符号__endthreadex这是因为MS-VisualC++的类库(微软基础班的缩写)要使用多线程时库,需要更改设置:

  [项目]-[设置]选择C/C 属性页,在种类中选择代码生成,再在使用运行时库中选择调试多线程或者多线程

  其中,单线程单线程静态链接库(发布版本)

  多线程多线程静态链接库(发布版本)

  多线程动态链接库多线程动态链接库(发布版本)

  调试单线程单线程静态链接库(调试版本)

  调试多线程多线程静态链接库(调试版本) )

  调试多线程动态链接库多线程动态链接库(调试版本)

  单线程:不需要多线程调用时,多用在磁盘操作系统环境下

  多线程:可以并发运行

  静态库:直接将库与程序链接,可以脱离MS-VisualC++的类库(微软基础班的缩写)库运行

  动态库:需要相应的动态链接库动态库,程序才能运行

  释放;排放;发布版本:正式发布时使用

  调试版本:调试阶段使用

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: