VC中常见的一些编译链接错误的解决

上传人:z**** 文档编号:169037035 上传时间:2022-11-14 格式:DOCX 页数:12 大小:25.91KB
收藏 版权申诉 举报 下载
VC中常见的一些编译链接错误的解决_第1页
第1页 / 共12页
VC中常见的一些编译链接错误的解决_第2页
第2页 / 共12页
VC中常见的一些编译链接错误的解决_第3页
第3页 / 共12页
资源描述:

《VC中常见的一些编译链接错误的解决》由会员分享,可在线阅读,更多相关《VC中常见的一些编译链接错误的解决(12页珍藏版)》请在装配图网上搜索。

1、VC 中常见的一些编译链接错误的解决2010-03-22 15:59问题 1:Linking.nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _endthreadexnafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol _beginthreadexlibcd.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainVC+ 默认的工程设置是单线程的,而

2、你使用了多线程,所以要修改设置。选择菜单“Project|settings,选择 C/C+标签,在 CODEGENERATION分类中选择除SINGLE-THREADED的其他选择。其中,Single-ThreadedMultithreaded multithreaded DLL Debug Single-Threaded Debug Multithreaded Debug Multithreaded DLL比如可以在 Use run-time library 中选择 Debug Multithreaded 或者 multithreaded单线程静态链接库(release版本) 多线程静态链接

3、库(release版本) 多线程动态链接库(release版本) 单线程静态链接库(debug版本)多线程静态链接库(debug版本)多线程动态链接库(debug版本)单线程:不需要多线程调用时,多用在DOS环境下多线程: 可以并发运行静态库:直接将库与程序Link,可以脱离MFC库运行 动态库: 需要相应的 DLL 动态库, 程序才能运行 release 版本: 正式发布时使用debug版本:调试阶段使用问题2fatal error C1010: unexpected end of file while looking for precompiled header directive 该如何

4、解 如果发生错误的文件是由其他的C代码文件添加进入当前工程而引起的,则 Alt+F7进入当前工程的Settings,选择C/C+选项卡,从Category 组合框中选中 Precompiled Headers,选择 Not Using Precompiled headers。确定如果发生错误的文件原本是该工程中的,则检查该文件头部有没有#include st dafx.h 语句,没有的话添加。如果还不行,也有可能是定义的类或结构体等最后忘了加分号,注意一下问题3:编译产生c1.exe什么原因?编译器的问题可能很多人在安装VC 6.0后有过点击“Compile”或者“Build”后被出现的 “C

5、omp il ing. ,Error spawning cl.exe ”错误提示给郁闷过。很多人的选择是重装,实际上这个问题很多情况下是由于路径设置的问题引起的,“CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录VC98Bin”下面,你可以到相应的路径下找到这个应用程 序。.2404633因此问题可以按照以下方法解决:点击VC“TOOLS(工具)” 一“Option(选 择)” 一“Directories(目录)”重新设置 “Excutable Fils、Include Files、Library Files、Source Files” 的路径。很多情况可能就一 个盘符的

6、不同(例如你的VC装在C,但是这些路径全部在D),改过来就OK 了。问题4:关于工程类型的错误libcmtd. lib(crt0.obj) : error LNK2001: unresolved external symbol _main答:建了 console工程,但是主函数写成了 winmain,Windows项目要使用Windows子系统,而不是Console,可以这样设置: Project Settings- 选择Link属性页, 在 Project Options 中将/subsystem:console 改成/subsystem:windows这样就把工程改该成了 Win32的工程

7、, 如果要保留成console工程,只要把主函数改成main问题5:关于工程类型的错误提示:LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbolWinMain16建了 Win32工程,但是主函数写成了 main,控制台项目要使用Console子系统,而不是Windows,设置:Project Settings- 选择Link属性页, 在 Project Options 中将/subsystem:windows 改成/subsystem:console这样就把工程改成了 console工程如果要保留Win32工程,只

8、要把主函数改成winmain问题6 程序入口设置错误, 提示:msvcrtd.lib(crtexeW.obj) : error LNK2001: unresolved external symbol _WinMain16通常,MFC项目的程序入口函数是WinMain,如果编译项目的Unicode版本,程 序入口必须改为wWinMainCRTS tart up,所以需要重新设置程序入口Project Settings- 选择C/C+属性页,在 Category 中选择 Output,再在 Ent ry-poin t symbol 中填入 wWinMainCRTS tart up,即可问题 7:

9、LNK2001 错误,如 error LNK2001: unresolved external symbol 一般这种错误是没有把需要的某些lib加到你的工程里面这里举个例子吧error LNK2001: unresolved external symbol _imp waveOutGetNumDevs0 看到这种错误,去msdn查一下waveOutGetNumDevs这个函数,然后看最后的 RequirementsRequirementsWindows NT/2000/XP: Included in Windows NT 3.1 and later.Windows 95/98/Me: Inc

10、luded in Windows 95 and later.Header: Declared in Mmsystem.h; include Windows.h. Library: Use Winmm.lib.于是把Winmm.lib力口到project -setting-link-object/library modules或者#pragma comment(lib,Winmm)/加了这个就不用到 setting 中再加 lib 了。关于这个LNK2001的错误,网上相关文章也比较多的,比如下面这段学习VC+ +时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于 编程者来说,最好改的

11、错误莫过于编译错误,而一般说来发生连接错误时, 编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不 明其所以然。如果不深入地学习和理解VC+ +,要想改正连接错误LNK2001非 常困难。初学者在学习VC+ +的过程中,遇到的LNK2001错误的错误消息主要为: unresolved ext ernal symbol “symbol(不确定的外部“符号)。 如果连接程序不能在所有的库和目标文件内找到所引用的函数、变量或 标签,将产生此错误消息。一般来说,发生错误的原因有两个:一是所引用 的函数、变量不存在、拼写不正确或者使用错误;其次可能使用了不同版本 的连接库。以下是

12、可能产生LNK2001错误的原因:一.由于编码错误导致的LNK2001。1. 不相匹配的程序代码或模块定义(.DEF)文件能导致LNK2001。例如, 如果在C+源文件内声明了一变量“varl,却试图在另一文件内以变量 “VAR1 ”访问该变量,将发生该错误。2如果使用的内联函数是在.CPP文件内定义的,而不是在头文件内定 义将导致LNK2001错误。3.调用函数时如果所用的参数类型同函数声明时的类型不符将会产生 LNK2001。4试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001。5. 要注意函数和变量的可公用性,只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使

13、用范围限制。当试图从文件外部访问 任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001。 函数内声明的变量(局部变量) 只能在该函数的范围内使用。C+的全局常量只有静态连接性能。这不同于C,如果试图在C+ +的 多个文件内使用全局变量也会产生LNK2001错误。一种解决的方法是需要时在 头文件中加入该常量的初始化代码,并在.CPP文件中包含该头文件;另一种 方法是使用时给该变量赋以常数。二.由于编译和链接的设置而造成的LNK20011. 如果编译时使用的是/NOD (/NODEFAULTLIB)选项,程序所需要的运行 库和MFC库在连接时由编译器写入目标文件模块,但除非在文件中明确

14、包含 这些库名,否则这些库不会被链接进工程文件。在这种情况下使用/NOD将导 致错误LNK2001。2 如果没有为wWinMainCRTS tar tup设定程序入口,在使用Unicode和MFC 时将得到“unresolved external on _WinMain16的 LNK2001 错误信息。3.使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内, 源文件中对“ func ”的引用,在目标文件里即对“ _imp_func”的引用。 如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行连接,将在_imp_func上发 生LNK2001 ;如果不使用/MD选项编译,在

15、使用MSVCxx.LIB连接时也会发生 LNK2001。4使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001。5. 当编译调试版的应用程序时,如果采用发行版模态库进行连接也会产生LNK2001 ;同样,使用调试版模态库连接发行版应用程序时也会产生相同的 问题。6. 不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可 能包含早先的版本没有的符号和说明。7. 在不同的模块使用内联和非内联的编译选项能够导致LNK2001。如果 创建C+库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头 文件里却关闭了函数内联(没有inline关键字),这

16、时将得到该错误信息。 为避免该问题的发生,应该在相应的头文件中用inline关键字标志内联函数。8. 不正确的/SUBSYSTEM或/ENTRY设置也能导致LNK2001。其实,产生LNK2001的原因还有很多,以上的原因只是一部分而已,对初 学者来说这些就够理解一阵子了。但是,分析错误原因的目的是为了避免错 误的发生。LNK2001错误虽然比较困难,但是只要注意到了上述问题,还是能 够避免和予以解决的。问题8:没有更新sdk而导致的编译出错 如编译windows核心编程的附书源码,会出错 Compiling.ErrorShow.cppYou are not using the latest

17、Platform SDK header/library files. This may prevent the project from building correctly. e:学习电子书windows核心编程programming_applicatin_for_microsoft_windows_sourcecode cmnhdr.h(212) : error C2065:GetWindowLongPtr : undeclared identifiere:学习电子书windows核心编程 programming_applicatin_for_microsoft_windows_sourc

18、ecode cmnhdr.h(212) : error C2065:GWLP_HINSTANCE : undeclared identifiere:学习电子书windows核心编程 programming_applicatin_for_microsoft_windows_sourcecode01- errorshowerrorshow.cpp(83) :error C2065: PCTSTR : undeclared identifiere:学习电子书windows核心编程 programming_applicatin_for_microsoft_windows_sourcecode01- e

19、rrorshowerrorshow.cpp(83) :error C2146: syntax error : missing ) before identifier LocalLock e:学习电子书windows核心编程programming_applicatin_for_microsoft_windows_sourcecode01- errorshowerrorshow.cpp(83) :error C2059: syntax error : )e:学习电子书windows核心编程 programming_applicatin_for_microsoft_windows_sourcecod

20、e01- errorshowerrorshow.cpp(125) :error C2664: DialogBoxParamA : cannot convert parameter 4 from long (struct HWND_ *,unsigned int,unsigned int,long) to,int (_stdcall *)(struct HWND_ *,unsigned int,unsigned int,long) None of the functions with this name in scope match the target type Error executing

21、 cl.exe.类似这种很多需要更新 sdk 的错误安装好sdk,然后配置路径TOOLoptiondirection 下在 include 下,添加C:PROGRAM FILESMICROSOFT SDKINCLUDE在lib下,添加C:PROGRAM FILESMICROSOFT SDKLIB这里假设 sdk 的安装路径是 C:PROGRAM FILESMICROSOFT SDK然后记得把这些添加的路径上移到第一的位置,切记/1、fata l error C1010 : unexpected end of f i l e wh i l e l ook i ng for precomp i l

22、 ed header directive。 寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include "stdafx.h") 2、fatal error C1083: Cannot open include file: R.h: No such file or directory不能打开包含文件“R.h” :没有这样的文件或目录。3、error C2011: C: class type redefinition类“C”重定义。4、error C2018: unknown character 0xa3不认识的字符0xa3( 般是汉字或中文标点符号)5、

23、error C2057: expected constant expression希望是常量表达式。(一般出现在switch语句的case分支中)6、error C2065: IDD_MYDIALOG : undeclared identifier“IDD_MYDIALOG” :未声明过的标识符。7、error C2082: redefinition of formal parameter bReset函数参数“bReset”在函数体中重定义。8、error C2143: syntax error: missing : before 句法错误:“”前缺少“;”。9、error C2146: s

24、yntax error : missing ; before identifier dc句法错误:在“de”前丢了“; ”。10、error C2196: case value 69 already used值69已经用过。(一般出现在switch语句的case分支中)11、error C2509: OnTimer : member function not declared in CHelloView成员函数“OnTimer没有在“CHelloView中声明。12、error C2511: reset: overloaded member function void (int) not fo

25、und in B重载的函数“void reset(int)在类“B”中找不到。13、e r r or C2555: B:f1: ov e r r i d i ng v i r t ual fun c t i on d i ff e r s from A:f1 only by return type or calling convention类B对类A中同名函数fl的重载仅根据返回值或调用约定上的区别。14、error C2660: SetTimer : function does not take 2 parameters“SetTimer”函数不传递2个参数。15、warning C4035

26、: f: no return value“f的return语句没有返回值。16、warningC4553:=:operatorhasnoeffect;didyouintend=?没有效果的运算符“= =;是否改为“=?17、warning C4700: local variable bReset used without having been initialized局部变量“ bRese t没有初始化就使用。l8、error C47l6: CMyApp:InitInstance : must return a value“CMyApp:Ini tins tance 函数必须返回一个值。19、

27、LINK : fatal error LNK1168: cannot open Debug/P1.exe for writing连接错误:不能打开Pl.exe文件,以改写内容。(一般是Pl.Exe还在运行,未 关闭)20、error LNK2001: unresolved external symbol "public: virtual _ _thiscall C:C(void)"连接时发现没有实现的外部符号(变量、函数等)1、fatalerrorC1010:unexpectedendoffilewhilelookingforprecompiled header direc

28、tive。寻找预编译头文件路径时遇到了不该遇到的文件尾。(一般是没有#include stdafx.h)2、fatal error C1083: Cannot open include file: R.h: No such file or directory不能打开包含文件“R.h” :没有这样的文件或目录。3、error C2011: C: class type redefinition类“C”重定义。4、error C2018: unknown character 0xa3不认识的字符0xa3。(一般是汉字或中文标点符号)5、error C2057: expected constant e

29、xpression 希望是常量表达式。(一般出现在switch语句的case分支中) 6、error C2065: IDD_MYDIALOG : undeclared identifier“IDD_MYDIALOG” :未声明过的标识符。7、error C2082: redefinition of formal parameter bReset函数参数“ bRese t”在函数体中重定义。8、error C2143: syntax error: missing : before 句法错误:“”前缺少“;”。9、error C2146: syntax error : missing ; befo

30、re identifier dc 句法错误:在“de”前丢了 “;”。10、error C2196: case value 69 already used值69已经用过。(一般出现在switch语句的case分支中)11、errorC2509:OnTimer:memberfunctionnotdeclaredinCHelloView 成员函数“OnTimer”没有在“CHelloView”中声明。12、error C2511: reset: overloaded member function void (int) not found in B重载的函数“void reset(int)”在类“

31、B”中找不到。13、error C2555: B:f1: overriding virtual funct ion differs from A:f1 only by return type or calling convention类B对类A中同名函数fl的重载仅根据返回值或调用约定上的区别。14、error C2660: SetTimer : function does not take 2 parameters“SetTimer”函数不传递2个参数。15、warning C4035: f: no return value“f”的ret urn语句没有返回值。16、warning C455

32、3: = = : operator has no effect; did you intend =?没有效果的运算符“= =”;是否改为“=”?17、warning C4700: local variable bReset used without having been initialized 局部变量“ bRese t”没有初始化就使用。18、error C4716: CMyApp:InitInstance : must return a value“CMyApp:Ini tins tance 函数必须返回一个值。19、LINK : fatal error LNK1168: cannot

33、open Debug/P1.exe for writing连接错误:不能打开Pl.exe文件,以改写内容。(一般是Pl.Exe还在运行,未 关闭)20、error LNK2001: unresolved external symbol public: virtual _ _thiscall C:C(void)连接时发现没有实现的外部符号(变量、函数等)。我装了 VC+6.0,本想运行程序,compile不会出错,但一 build就出现这个错误,不知道怎么解决? 哪位高手知道的话麻烦帮帮忙,谢谢啦!最佳答案:打不开库文件libcid.lib,在工程 设置 目录下 有个C+LINK,加上libci

34、d.lib。编译,还是 LINK : fatal error LNK1104: cannot open file libcid.lib啲话,说明你没有文件 libcid.libo搜索一下你的磁盘有没有libcid.lib,没有的话下载一个或从别人那里拷贝一个,放到Visual Studio -VC98-lib目录下,同样在工程下加上 设置 目录下 有个c+LINK,加上libcid.libo 再编译,就行了。/菜单里project (工程)-settings (设置)出现settings选项卡,选择LINK选项。有个Object/Library modules,这里就是让你添加库文件的。你输入

35、你要用的lib的名字(在 这里输入libcid.lib).点确定。、还有可能你的路径配置错了。vc6.0编译器根据你设的搜索路径来找文件,路径错了也可能 导致上述错误,配置如下。打开vc界面点击VC“TOOLS (工具)”一“Option (选择)”Directories (目录)重新设置Excutable Fils、Include Files、Library Files、Source Files的路径。很多情况可能就一个盘符的不同 (例如你的VC装在C,但是这些路径全部在D),改过来就0K 了。如果你是按照初始路径安装vc6.0的,路径应为:executatble files:C:Progr

36、am FilesMicrosoft Visual StudioCommo nMSDev98B inC:Program FilesMicrosoft Visual StudioVC98BINC:Program FilesMicrosoft Visual StudioCommo nTOOLSC:Program FilesMicrosoft Visual StudioCommo nTOOLSWINNTin clude files:C:Program FilesMicrosoft Visual StudioVC98INCLUDEC:Program FilesMicrosoft Visual Studi

37、oVC98MFCINCLUDEC:Program FilesMicrosoft Visual StudioVC98ATLINCLUDElibrary files:C:Program FilesMicrosoft Visual StudioVC98LIBC:Program FilesMicrosoft Visual StudioVC98MFCLIBsource files:C:Program FilesMicrosoft Visual StudioVC98MFCSRCC:Program FilesMicrosoft Visual StudioVC98MFCINCLUDEC:Program FilesMicrosoft Visual StudioVC98ATLINCLUDEC:Program FilesMicrosoft Visual StudioVC98CRTSRC如果你装在其他盘里,则仿照其路径变通就行(我就是装在D盘)。关键是microsoft visual studio后面的东西要相同。主义大小写。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!