当前位置: 首页 > 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的中断优先级和中断嵌套(及容易理解错误的说明)
  • python3.6+scrapy+mysql 爬虫实战
  • 4个实用的微服务测试策略
  • js ES6 求数组的交集,并集,还有差集
  • k8s如何管理Pod
  • Python利用正则抓取网页内容保存到本地
  • V4L2视频输入框架概述
  • 分布式熔断降级平台aegis
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (第一天)包装对象、作用域、创建对象
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (万字长文)Spring的核心知识尽揽其中
  • (五)MySQL的备份及恢复
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)winform之ListView
  • (转载)hibernate缓存
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • ..回顾17,展望18
  • .NET Core引入性能分析引导优化
  • .Net MVC4 上传大文件,并保存表单
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • .NET成年了,然后呢?
  • .NET程序员迈向卓越的必由之路
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • ::before和::after 常见的用法
  • ??myeclipse+tomcat
  • @JsonFormat与@DateTimeFormat注解的使用
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [bzoj1901]: Zju2112 Dynamic Rankings
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [CF]Codeforces Round #551 (Div. 2)
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [ES-5.6.12] x-pack ssl
  • [IOI2007 D1T1]Miners 矿工配餐
  • [JavaEE系列] Thread类的基本用法