当前位置: 首页 > news >正文

[]error LNK2001: unresolved external symbol _m

原文地址: error LNK2001: unresolved external symbol _main VC++常见错误 作者: 半岛鱼
error LNK2001: unresolved external symbol _main
2009年03月15日 星期日 00:23
在学习VC++的过程中,遇到的LNK2001错误的错误消息主要为:
unresolved external symbol “symbol”(不确定的外部“符号”)。
如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本的连接库。
以下是可能产生LNK2001错误的原因:
一.由于编码错误导致的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时将得到“unresolved external on _WinMain@16”的LNK2001错误信息。
3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func” 的引用。如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在__imp__func上发生LNK2001;如果不使用/MD选项编
译,在使用MSVCxx.LIB连接时也会发生LNK2001。
4.使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。
5.当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产生LNK2001;同样,使用调试版模态库连接发行版应用程序时也会产生相同的问题。
6.不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。
编程时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),这时将得到该错误信息。为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。
8.不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。

解决方法:

解决外部符号错误:_main,_WinMain@16,__beginthreadex EJ ,?,$ O
在创建MFC项目时, 不使用MFC AppWizard向导,   就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有: MMb 4<P P
libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main 1 Z oI[ )
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 h%^. xh 7n
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 eb <gd^P9^
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex p# Y *I6 n
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex $ c 6Uk6rzIg]qb ]zy
1. Windows子系统设置错误, 提示: o 3y,zfMlibcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main D J;'^
Windows项目要使用Windows子系统, 而不是Console, 可以这样设置: b sm'W ?(SPK{ S *!"
[Project] --> [Settings] --> 选择"Link"属性页, SMr`N6Bi-
在Project Options中将/subsystem:console改成/subsystem:windows  {,$_ K&_T ^[ ;$y
2. Console子系统设置错误, 提示: W.X c^ $ eLIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 v'5F W}u.9U=Uiu !
控制台项目要使用Console子系统, 而不是Windows, 设置: $QNp DWpW;:t9 H 5
[Project] --> [Settings] --> 选择"Link"属性页, ~q ~ 1wn?
在Project Options中将/subsystem:windows改成/subsystem:console ~cc 'znOG; ~ tr`.
3. 程序入口设置错误, 提示: L bUCBu @
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 7g5 eTu2# g3$ nlr
通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口: &yOb1rZv^O 5!RC oe
[Project] --> [Settings] --> 选择"Link"属性页, Ai;yph >wG
在Category中选择Output, :=~*_G #m
再在Entry-point symbol中填入wWinMainCRTStartup, 即可 &2 |9% ;xf?zlmtgv;
4. 线程运行时库设置错误, 提示: r( ' 'Z0-
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex Dc :X77eX4
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex @9 9izEF>{xJ ))?}'
这是因为MFC要使用多线程时库, 需要更改设置: <;! {;YI l!F9f?_sl
[Project] --> [Settings] --> 选择"C/C++"属性页, ~ S1Od"^W
在Category中选择Code Generation, #. b9An"
再在Use run-time library中选择Debug Multithreaded或者multithreaded &Az~@YkwQH
咸鱼游侠(75374355) 12:11:11 o j@ DY,?
其中, 9G BpNV Z-
Single-Threaded                 单线程静态链接库(release版本) ,G" CS i)
Multithreaded                   多线程静态链接库(release版本) "bGa q[] t
multithreaded DLL               多线程动态链接库(release版本) vY7[} Hi#
Debug Single-Threaded           单线程静态链接库(debug版本) K96ZA) 6s
Debug Multithreaded             多线程静态链接库(debug版本) ) yM=kN;a.
Debug Multithreaded DLL         多线程动态链接库(debug版本) }s G<P]gQe Fo B'
单线程: 不需要多线程调用时, 多用在DOS环境下 #7 g<} pbh
多线程: 可以并发运行 gBHOl?y
静态库: 直接将库与程序Link, 可以脱离MFC库运行 | mZ 3'
动态库: 需要相应的DLL动态库, 程序才能运行 jio {}f<l
release版本: 正式发布时使用 -xE6 yG @
debug版本: 调试阶段使用

相关文章:

  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • []我的函数库
  • 波分复用(WDM) 技术和概念
  • 2011年05月21日 男人成熟气质磨练
  • 【MSP430时钟】MSP430 5438时钟系统介绍
  • MSP 430 心得体会
  • MSP430X5XX的时钟系统与低功耗模式
  • MSP430:P1OUT=4、P1OUT |=4、P1OUT -=~8的意思
  • 【开关中断】MSP430 怎么开关中断,开关中断的代码|命令。
  • P3DIR|=BIT0、P3OUT=~BIT0  的含义
  • MSP430 5438 单片机学习笔记(鱼香茄子)
  • 6月2日 周四 晴   MSP430 5438 定时器A TIMER A 新认识
  • msp430的定时器A 划分几个独立时间间隔
  • msp430的中断优先级和中断嵌套(及容易理解错误的说明)_liangchaoxi的IT博客_新浪博客......
  • msp430的中断优先级和中断嵌套(及容易理解错误的说明)
  • 3.7、@ResponseBody 和 @RestController
  • Django 博客开发教程 16 - 统计文章阅读量
  • flutter的key在widget list的作用以及必要性
  • Java精华积累:初学者都应该搞懂的问题
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP 7 修改了什么呢 -- 2
  • Shell编程
  • Sublime text 3 3103 注册码
  • yii2中session跨域名的问题
  • 从0到1:PostCSS 插件开发最佳实践
  • 搭建gitbook 和 访问权限认证
  • 飞驰在Mesos的涡轮引擎上
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 你对linux中grep命令知道多少?
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ionic入门之数据绑定显示-1
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • ###项目技术发展史
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)(1.9) MSP (version 4.2)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (四)模仿学习-完成后台管理页面查询
  • (已解决)什么是vue导航守卫
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (轉)JSON.stringify 语法实例讲解
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET中GET与SET的用法
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @ModelAttribute使用详解
  • @Query中countQuery的介绍
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [acm算法学习] 后缀数组SA
  • [AIGC] MySQL存储引擎详解
  • [Android 13]Input系列--获取触摸窗口
  • [android] 手机卫士黑名单功能(ListView优化)