学习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版本: 调试阶段使用

VC6.0 error LNK2001: unresolved external symbol _main解决办法的更多相关文章

  1. [异常] VC6.0 error LNK2001: unresolved external symbol _main解决办法

    来自:http://www.douban.com/note/65638800/ 学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说 ...

  2. error LNK2001: unresolved external symbol _main解决办法(zz)

    error LNK2001: unresolved external symbol _main解决办法   解决外部符号错误:_main,_WinMain@16,__beginthreadex -!t ...

  3. VC6.0 error LNK2001: unresolved external symbol _main(转)

    学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过.产生连接错误的原因非常多,尤其LNK2001错误 ...

  4. VC6.0 error LNK2001: unresolved external symbol __imp__ntohl@4

    --------------------Configuration: oxToint1 - Win32 Debug-------------------- Linking... main.obj : ...

  5. [Window编程][VC6.0++][error LNK2001: unresolved external symbol __imp__PlaySoundA@12]

    错误情况 这几天看<Windows游戏编程大师技巧>,在看第三章的时候,把书上的例子敲了一边,但是出现了下述错误,最后在网上找到了解决方法. 错误截图 解决方法 在main.cpp头文件下 ...

  6. error LNK2001: unresolved external symbol _main

    想运行一个网上下载的opengl离屏渲染(渲染到纹理FBO)的程序,然后一直报错 error LNK2001: unresolved external symbol _main 解决了一下午终于弄明白 ...

  7. LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main

    在创建MFC项目时,如果没有设置好项目参数, 就会在编译时产生很多连接错误, 如我今天遇到的: LIBCD.lib(crt0.obj) : error LNK2001: unresolved exte ...

  8. error LNK2001: unresolved external symbol __imp___time64

    Q: vs2005 generate a static lib(libva.lib), used in vc++6.0, error LNK2001: unresolved external symb ...

  9. error LNK2001: unresolved external symbol __imp__WSAStartup@8 SOCKET(转)

    VC6.0下的错误信息: error LNK2001: unresolved external symbol __imp__socket@12 error LNK2001: unresolved ex ...

随机推荐

  1. JProfiler使用详细教程学习笔记

    JProfiler学习笔记    推荐文章:JProfiler 入门教程 一.安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请 ...

  2. H5常用代码:页面框架

    万变不离其宗,道法自然! 虽然H5的小项目一波又一波,但有一个东东基本没什么变化,那就是整个页面的框架结构. 我所常用的H5常用页面框架如下: <!DOCTYPE html> <ht ...

  3. Java band [Cite]

    SampleModel  取样模型Databuffer 数据缓冲区 Raster 光栅Sample 样本band  带 SampleModel是java awt中的一个抽象类,它定义了一个接口,用于提 ...

  4. 通过Ruby On Rails 框架来更好的理解MVC框架

    通过Ruby On Rails 框架来更好的理解MVC框架   1.背景    因为我在学习软件工程课程的时候,对于 MVC 框架理解不太深入,只是在理论层面上掌握,但是不知道如何在开发中使用 MVC ...

  5. python两个文件的对比

    #encoding=utf-8 class SyncPagemaptoDB(object): def loadOldmap(self,oldpage,newpage,new_version): map ...

  6. android: 通过内容提供器读取系统联系人

    读取系统联系人 由于我们之前一直使用的都是模拟器,电话簿里面并没有联系人存在,所以现在需要自 己手动添加几个,以便稍后进行读取.打开电话簿程序,界面如图 7.1 所示. 图   7.1 可以看到,目前 ...

  7. 解决真机调试时Eclipse DDMS上打不开/data目录的问题

    一般真机调试时DDMS里面的File Explorer是不能打开/data 目录的,不过也很容易解决. 1.首先手机要root.这个很简单,网上一大堆资料和软件. 2.仅仅root之后还不行,下载一个 ...

  8. RabbitMQ 入门

    简介   RabbitMQ是一个Message Broker,核心思想就是接受消息,转发消息. 实现的协议:AMQP.   术语(Jargon)   P,Producing,制造和发送信息的一方. Q ...

  9. Facebook is Hiring!

    I am a software engineer in Facebook. I joined Facebook a year ago and now doing some iOS stuff. If ...

  10. Dom4J解析xml文件动态转换为List<Bean>或者Map集合

    大家在解析大量相似xml文件的时候是否会遇到这样一个问题:冗余的代码去set定义的实体对象Bean的值,基本都是一样的操作   而且毫无任何代码价值可言所以在这写了一个简单的例子,类封装了几个方法你只 ...