学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,

而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。

如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。

初学者在学习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

在创建MFC项目时, 不使用MFC AppWizard向导, 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol

_main

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol

_WinMain@

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external

symbol _WinMain@

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external

symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external

symbol __endthreadex

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

libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol

_main

Windows项目要使用Windows子系统, 而不是Console, 可以这样设置:

[Project] --> [Settings] --> 选择"Link"属性页, 在Project

Options中将/subsystem:console改成/subsystem:windows 2. Console子系统设置错误, 提示:

LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol

_WinMain@控制台项目要使用Console子系统, 而不是Windows, 设置:

[Project] --> [Settings] --> 选择"Link"属性页

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

msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external

symbol _WinMain@通常, MFC项目的程序入口函数是WinMain,

如果编译项目的Unicode版本, 程序入口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口:

[Project] --> [Settings] --> 选择"Link"属性页,

在Category中选择Output, 再在Entry-point symbol中填入wWinMainCRTStartup,

即可

4. 线程运行时库设置错误, 提示:nafxcwd.lib(thrdcore.obj) : error LNK2001:

unresolved external symbol __beginthreadex

nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external

symbol __endthreadex这是因为MFC要使用多线程时库, 需要更改设置:

[Project] --> [Settings] --> 选择"C/C++"属性页, 在Category中选择Code

Generation,再在Use run-time library中选择Debug Multithreaded

或者multithreaded

其中,

Single-Threaded 单线程静态链接库(release版本)

Multithreaded 多线程静态链接库(release版本)

multithreaded

DLL 多线程动态链接库(release版本)

Debug

Single-Threaded 单线程静态链接库(debug版本)

Debug

Multithreaded 多线程静态链接库(debug版本) )

Debug Multithreaded

DLL 多线程动态链接库(debug版本)

单线程: 不需要多线程调用时, 多用在DOS环境下

多线程: 可以并发运行

静态库: 直接将库与程序Link, 可以脱离MFC库运行

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

release版本: 正式发布时使用

debug版本: 调试阶段使用

c语言错误lnk2001,vc6.0 LNK2001错误原因及改正方法相关推荐

  1. (转)VC6.0同时打开两个工程方法

    Win7系统:在Win7操作系统下,如果是以Administrator登陆,则VC6.0打开工程文件的时候,不能同时打开多个工程文件,后打开的工程会将前一个工程close掉,这样,VC6.0只能出现一 ...

  2. 使用Fastjson解析List对象时出现:{“$ref“:“$.data[0].task.OBJECTS[0]“}的问题原因及解决方法

    使用Fastjson解析List对象时出现:{"$ref":"$.data[0].task.OBJECTS[0]"}的问题原因及解决方法 参考文章: (1)使用 ...

  3. 汇承4.0蓝牙BLE串口助手HC-COM的使用方法及出错的原因和改正方法

       本文主要介绍在使用汇承4.0蓝牙BLE串口助手HC-COM,通过手机向蓝牙模块发送数据.或者通过手机向与蓝牙模块连接的单片机发送指令时,串口中断函数的编写方法及出错的原因和改正方法    我们怎 ...

  4. mysql 必知必会导入官方数据库,出现错误,ASCII ‘\0‘ appeared in the statement解决方法

    最近在学MySQL必知必会,导入自带的数据库,出现如下错误: ERROR: ASCII '\0' appeared in the statement, but this is not allowed ...

  5. c语言水平制表符作用,C语言课:VC6.0中水平制表符和退格符的进一步说明

    关于VC6.0中水平制表符'\t'和退格符'\b' 的进一步说明 (1)使用printf命令输出1个水平制表符'\t',则在荧幕上打印长度为8个空格的表位,该表位的起点光标位置是每行开头或上一个表位结 ...

  6. VC6.0同时打开两个工程方法

    vc能否同时打开两个工程或点击第二项目时,不会关闭掉已经打开的项目,怎样让它而另起一个IDE 答:1).XP系统:是这样,控制面板---文件夹选项----文件类型----找到DSW---高级---- ...

  7. java 502错误_PHPstorm 10.0.3错误502错误的网关(由于JavaVM?)

    我已经在Windows机器上的Apache文件夹中安装了PHPstorm 10.0.3试用版和PHP,但是当我使用PHP解释器时,大约50-90%的时间出现错误502 Bad Gateway. 当这只 ...

  8. 宽带连接错误提示678和691的原因,解决方法

    宽带连接错误提示678,为什么? 我的电脑宽带连接不上,错误提示678,有时还是能连上的,但机会很少得几乎和中五百万一样,重启电脑和猫还是没法解决.电信的人来看了不下五次还是没有解决.网卡,猫,线路都 ...

  9. vc6.0程序界面实现XP风格方法

    本文转帖自:http://ily961.bokee.com/3306477.html 关于让自己的程序界面实现XP风格这个问题,在网上的讨论很多,大多数的作法都是写一个.manifest文件,然后将文 ...

最新文章

  1. 【正一专栏】新赛季欧冠小组赛猜想
  2. 富士施乐打印机-查看端口号
  3. web 项目集成福昕_项目学生:Web服务集成
  4. 【Breadth-first Search 】513. Find Bottom Left Tree Value
  5. 简单说明c语言程序步骤,C语言的入门简介和三个简单的C语言程序详细说明
  6. 无盘服务器磁盘缓存,云更新无盘服务器磁盘缓存器
  7. 静态路由及默认路由实验配置
  8. 点击添加一行_微信接龙表格操作方法图文教程,以及微信聊天框怎么另起一行...
  9. CentOS 7.2 rpm 安装 Mysql 5.7
  10. java 映射servlet,java – 将映射或对象从jsp传递到servlet
  11. 自媒体平台越来越多,取舍之后我只推荐这7家平台
  12. 163邮箱 提示xm002 NO SELECT Unsafe Login. Please contact kefu@188.com for help
  13. 电子商务宝盒PRIMO
  14. 不要跌入孤独寂寞的陷阱
  15. 实现类似淘票票电影滑动选择的效果
  16. Base-N 算法加密解密实现:
  17. Java 经典算法分析总汇
  18. 打开Setup.exe文件时,系统提示Windows 无法访问指定设备,路径或文件,你可能没有合适的权限访问这个项目。
  19. 查看linux文件工具,Linux基础命令-文本文件查看工具
  20. 304状态码详解(协商缓存)

热门文章

  1. html控制电脑关机,用手机控制电脑关机 方法介绍【图文】
  2. ip设置 kali 重置_Kali手动配置IPDNS
  3. 泳道图是什么?究竟如何绘制?
  4. Linux--Clion安装
  5. 电流表的使用和接线,85C1型机械电流表讲解
  6. matlab10的阶层怎么输入,在Matlab中编写阶乘函数,并调用该函数来生成一个1!,......,10!的阶乘表...
  7. Win32多线程 -- 异步IO(overlapped IO)
  8. 版本控制工具Git的使用(一)
  9. ROS 北通游戏手柄灵敏度 频率过高, xbox360/ ps2/3模式切换问题
  10. h5页面背景图在移动端不显示