error link2005总结
Cisco交换机error:link-flap

Cisco交换机error:link-flapMA实验室全部⽆法获取IP地址,检查物理线路正常之后,发现上⾏端⼝灯不亮,进⼊交换机后show logging:%PM-4-ERR_DISABLE: link-flap error detected on Gi1/0/51, putting Gi1/0/51 in err-disable state端⼝进⼊假死状态是交换机本⾝的防护机制,那么我总结了下⾯的解决⽅法,供⼤家参考。
⼀:查看原因登录到交换机后,查看⽇志:>show logging会发现其中有以下信息(以我遇到的问题举例):%PM-4-ERR_DISABLE: link-flap error detected on Gi1/0/51, putting Gi1/0/51 in err-disable state所以,他所在端⼝是因为link-flap才造成的假死。
link-flap是链路抖动,基本上是由于物理链路的问题导致,只要端⼝在10秒内出现了5次up/down,就会假死。
那么,这种情况⽆⾮就是⽹⼝或⽹线本⾝的问题,还有⼀种可能是因为⽹卡的设置有问题(尤其是单双⼯模式设置)。
然⽽,我给他重启了端⼝,他再也没有call过来了,具体什么情况也未可知了。
⼆:端⼝恢复当然,直接重启端⼝当然可以解决问题,但也只是权宜之计,根本问题不解决,他下次在连设备的时候依然会出现异常。
既然假死是由于交换机的防护机制,那么我们就按照具体情况把相应的防护机制禁⽤掉。
(config)#no errdisable detect cause ******会导致 err-disabled 状态的原因,可以通过下⾯的命令查看:#show errdisable detect你会看到很多造成假死的原因。
当然,你也可以暴⼒点:(config)#no errdisable detect cause all禁⽤全部防护机制,这样不管你怎么折腾,都不会errdisable了。
C语言中link的错误解决方案

link错误-link4098libcmtd.lib(tolower.obj) : error LNK2005: __tolower already defined in libcd.lib(tolower.obj) libcmtd.lib(tolower.obj) : error LNK2005: _tolower already defined in libcd.lib(tolower.obj) libcd.lib(crt0init.obj) : warning LNK4098: defaultlib "libcmtd.lib" conflicts with use of other libs; use /NODEFAULTLIB:libraryDebug/VGS2DEBUGDLL.exe : fatal error LNK1169: one or more multiply defined symbols found Error executing link.exe.解决方案:Project -> Settings -> Link -> project option中加入/nodefaultlib:"LIBCMTD"error LNK2001: unresolved external symbol _main解决办法解决外部符号错误:_main,_WinMain@16,__beginthreadex在创建MFC项目时, 不使用MFC AppWizard向导, 如果没有柚煤孟钅坎问? 就会在编译时产生很多连接错误, 如error LNK2001错误, 典型的错误提示有:libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainLIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex1. Windows子系统设置错误, 提示:libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _mainWindows项目要使用Windows子系统, 而不是Console, 可以这样设置:[Project] --> [Settings] --> 选择"Link"属性页,在Project Options中将/subsystem:console改成/subsystem:windows2. Console子系统设置错误, 提示:LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16控制台项目要使用Console子系统, 而不是Windows, 设置:[Project] --> [Settings] --> 选择"Link"属性页,在Project Options中将/subsystem:windows改成/subsystem:console3. 程序入口设置错误, 提示:msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16通常, 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版本: 调试阶段使用fatal error C1083: Cannot open include file: '': No such file or directory答案在VC++的Tools/Option/Directory的Include和Library中加入相关路径nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argvnafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argcnafxcw.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctypenafxcw.lib(filelist.obj) : error LNK2001: unresolved external symbol __mbctypenafxcw.lib(dcprev.obj) : error LNK2001: unresolved external symbol __mbctypenafxcw.lib(timecore.obj) : error LNK2001: unresolved external symbol __mbctype..\..\Output\Release/FirewallMan.exe : fatal error LNK1120: 3 unresolved externals解决方法:在Preprocessor中定义_AFXDLL如果它提示:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds就这样改:C/C++->Code Generation->Multithread DLL (即实现/MD选项)int WINAPI RmuGetPaStatus (HANDLE hCom, UCHAR* uStatus, UCHAR flagCrc);其中,UCHAR*uStatus是一个传递的地址,关联位置可填地址并且在外部利用指针得到值。
LINK2005错误——重复定义错误

LINK2005错误——重复定义错误编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。
弄清楚它形成的原因,就可以轻松解决它了。
造成LNK2005错误主要有以下几种情况:1.重复定义全局变量。
可能存在两种情况:A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。
其实这是错误的,全局变量是针对整个工程的。
正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj。
切记的就是不能给变量赋值否则还是会有LNK2005错误。
这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:(1)声明必须使用extern关键字;(2)不能给变量赋初值所以,下面的是声明:extern int a;下面的是定义int a; int a = 0; extern int a =0;B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。
2.头文件的包含重复。
往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。
解决办法是在需要包含的头文件中做类似的处理:#ifndef MY_H_FILE //如果没有定义这个宏#define MY_H_FILE //定义这个宏……. //头文件主体内容…….#endif上面是使用宏来做的,也可以使用预编译来做,在头文件中加入:#pragma once//头文件主体3.使用第三方的库造成的。
sql 2005 error 40远程连接错误

sql 2005 error 40远程连接错误数据库 2010-01-22 19:43:38 阅读432 评论0 字号:大中小在尝试从远程计算机连接到 Microsoft SQL Server 2005 实例时,可能会接收到错误消息。
在使用任何程序连接到 SQL Server 时都可能会发生此问题。
例如,在使用 SQLCMD 实用工具连接到 SQL Server 时收到以下错误消息:Sqlcmd:错误:Microsoft SQL Native Client:建立到服务器的连接时发生错误。
连接到 SQL Server 2005 时,默认设置 SQL Server 不允许远程连接这个事实可能会导致失败。
如果没有将 SQL Server 2005 配置为接受远程连接,则可能会发生此问题。
默认情况下,SQL Server 2005 Express Edition 和 SQL Server 2005 Developer Edition 不允许远程连接。
若要配置 SQL Server 2005 以允许远程连接,请完成以下所有步骤:•在您要从远程计算机连接到的 SQL Server 实例上启用远程连接。
•打开 SQL Server Browser 服务。
•配置防火墙以允许与 SQL Server 和 SQL Server Browser 服务相关的网络通讯。
本文介绍如何完成这些步骤中的每一步。
更多信息若要在 SQL Server 2005 实例上启用远程连接并打开 SQL Server Browser 服务,请使用 SQL Server 2005 外围应用配...若要在 SQL Server 2005 实例上启用远程连接并打开 SQL Server Browser 服务,请使用 SQL Server 2005 外围应用配置器工具。
在安装 SQL Server 2005 时会安装外围应用配置器工具。
为 SQL Server 2005 Express Edition 或 SQL Server 2005 Developer Edition 启用远程连接必须为要从远程计算机连接到的每个 SQL Server 2005 实例启用远程连接。
为什么会出现LNK2005“符号已定义”的链接错误?

VC的链接器是link.exe,因为main.obj保存了缺省库信息,所以可以用
link main.obj libc.lib
或者
link main.obj
来生成可执行文件main.exe,这两个命令是等价的。但是如果你用
link main.obj libcd.lib
的话,链接器会给出一个警告: "warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library",因为你显式指定的标准库版本与目标文件的缺省值不一致。通常来说,应该保证链接器合并的所有目标文件指定的缺省标准库版本一致,否则编译器一定会给出上面的警告,而LNK2005和LNK1169链接错误则有时会出现有时不会。那么这个有时到底是什么时候?呵呵,别着急,下面的一切正是为喜欢追根究底的你准备的。
#pragma comment(lib,"xxxx")
编译指示命令(compiler directive)指定要链接的库,那么这个信息也会被保存到目标文件的缺省库信息项中,且位于缺省标准库之前。如果有多个这样的命令,那么对应库名在目标文件中出现的顺序与它们在源程序中出现的顺序完全一致(且都在缺省标准库之前)。
VC带的编译器是cl.exe,它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib);/MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;/MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,因此/MLd对应调试版单线程静态标准库(libcd.lib),/MTd对应调试版多线程静态标准库(libcmtd.lib),/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,DLL是msvcrtd.dll)。虽然我们的确在编译时明白无误地告诉了编译器应用程序希望使用什么版本的标准库,可是当编译器干完了活,轮到链接器开工时它又如何得知一个个目标文件到底在思念谁?为了传递相思,我们的编译器就干了点秘密的勾当。在cl编译出的目标文件中会有一个专门的区域(关心这个区域到底在文件中什么地方的朋友可以参考COFF和PE文件格式)存放一些指导链接器如何工作的信息,其中有一项就叫缺省库(default library),它指定了若干个库文件名,当链接器扫描该目标文件时将按照它们在目标模块中出现的顺序处理这些库名: 如果该库在当前输入文件列表中还不存在,那么便把它加入到输入文件列表末尾,否则略过。说到这里,我们先来做个小实验。写个顶顶简单的程序,然后保存为main.c :
我总结的KEIL51调试的错误总结

KEIL51调试时一些的错误总结(1)提示无M51文件编译时候提示:F:\...\XX.M51File has been changed outside the editor, reload ?------解决方法:重新生成项目,产生STARTUP.A51即可。
(2)L15重复调用***WARNING L15: MULTIPLE CALL TO SEGMENTSEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPICALLER1: ?PR?VSYNC_INTERRUPT?MAINCALLER2: ?C_C51STARTUP如果函数可以在其执行时被调用,则情况会变得更复杂一些。
这时可以采用以下几种方法:1.主程序调用该函数时禁止中断,可以在该函数被调用时用#pragma disable语句来实现禁止中断的目的。
必须使用OVERLAY指令将该函数从覆盖分析中除去。
2.复制两份该函数的代码,一份到主程序中,另一份复制到中断服务程序中。
3.将该函数设为重入型。
例如:void myfunc(void) reentrant {...}这种设置将会产生一个可重入堆栈,该堆栈被被用于存储函数值和局部变量,用这种方法时重入堆栈必须在STARTUP.A51文件中配置。
这种方法消耗更多的RAM并会降低重入函数的执行速度。
(3)L16无调用*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESSSEGMENT: ?PR?_COMPARE?TESTLCD说明:程序中有些函数例如COMPARE(或片段)以前(调试过程中)从未被调用过,或者根本没有调用它的语句。
这条警告信息前应该还有一条信息指示出是哪个函数导致了这一问题。
只要做点简单的调整就可以。
不理它也没什么大不了的。
解决方法:去掉COMPARE()函数或利用条件编译#if …..#endif,可保留该函数并不编译。
ERRORconda.core.link:_execute(481)问题总结
ERRORconda.core.link:_execute(481)问题总结你好在刚刚安装的Windows10 conda上,我很惊讶地被告知要将Navigator从1.7.0升级到1.8.2,因为我刚刚安装它。
由于软件包没有安装在Navigator上,我尝试使⽤下⾯的命令升级,因为导航器升级只是运⾏了太长时间(超过30分钟)。
conda更新anaconda-navigator出错:ERROR conda.core.link:_execute(481):卸载包'defaults :: freetype-2.8-h51f8f2c_1'时发⽣错误。
PermissionError(13,'访问被拒绝')完整输出如下。
我也⽆法在Navigator或命令提⽰符下安装软件包。
我试图安装knitr和nbstripout但都失败了解决环境:完成==>警告:存在较新版本的conda。
<==当前版本:4.4.10最新版本:4.5.0请通过运⾏更新conda$ conda update -n base conda套餐计划环境位置:C:\ ProgramData \ Anaconda3添加/更新的规格:- anaconda-navigator以下包将更新:certifi: 2018.1.18-py36_0 --> 2018.1.18-py36_0 conda-forgefreetype: 2.8-h51f8f2c_1 --> 2.8.1-vc14_0 conda-forge [vc14]jpeg: 9b-hb83a4c4_2 --> 9b-vc14_2 conda-forge [vc14]libxml2: 2.9.7-h79bbb47_0 --> 2.9.8-vc14_0 conda-forge [vc14]sqlite: 3.22.0-h9d3ae62_0 --> 3.22.0-vc14_0 conda-forge [vc14]以下包将被降级:yaml: 0.1.7-hc54c509_2 --> 0.1.7-vc14_0 conda-forge [vc14]继续([y] / n)?ÿ准备事务:done验证事务:done执⾏事务:失败ERROR conda.core.link:_execute(481):卸载软件包'defaults :: freetype-2.8-h51f8f2c_1'时发⽣错误。
C++工程编译之“errorLNK2001:无法解析的外部符号”
C++⼯程编译之“errorLNK2001:⽆法解析的外部符号” 今天⼀整天都在折腾“error LNK2001: ⽆法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译⽅式必须统⼀才⾏,要不然很容易对库函数的引⽤产⽣冲突。
简单来说就是,如果使⽤的第三⽅函数库编译⽅式采⽤/MD,那么主⼯程也应该使⽤/MD。
我使⽤了libevent,⽽主⼯程默认采⽤/MT,所以需要忽略⼀⼤堆的函数库,我还纳闷呢,怎么会这么奇怪!!今天总算是解决了长久以来的困惑了。
下⾯引⽤⼀篇⽂章的描述: 再参考⼀篇:BackgroundMSDN中对于在不同的配置下Link的LIB作了说明:C Runtime Library:开关对应的库版本/MD MSVCRT.LIB多线程DLL的Release版本/MDd MSVCRTD.LIB多线程DLL的Debug版本/MT LIBCMT.LIB多线程静态链接的Release版本/MTd LIBCMTD.LIB多线程静态链接的Debug版本/clr MSVCMRT.LIB托管代码和⾮托管代码混合/clr:pure MSVCURT.LIB纯托管代码C++ Standard Library:开关对应的库版本/MD MSVCPRT.LIB多线程DLL的Release版本/MDd MSVCPRTD.LIB多线程DLL的Debug版本/MT LIBCPMT.LIB多线程静态链接的Release版本/MTd LIBCPMTD.LIB多线程静态链接的Debug版本 编译器会⾃动根据编译选项,选择对应的LIB⽂件。
⼀般情况下这不会出现问题。
然⽽,在部分情况下,⼀旦你的程序的各个部分(LIB, OBJ…)并⾮由相同的编译选项编译出,⽽Link在⼀起的话,会出现各种各样的看似很难解决的问题,这类问题主要以重复定义的错误形式存在,通常的解决⽅法也很简单,就是选择同样的编译选项进⾏编译之后再Link。
使用VC2005一些问题及解决方案(一)
使用VC2005一些问题及解决方案(一)首先是我使用VC2005在不通阶段的不通感受:刚开始安装VS2005时候感觉:真是大啊!装了我一个上午!!而且运行个VC有时能耗我好大的内存。
刚使用VC2005时候的感受:界面挺不错,貌似功能更强大,对C++标准支持的很好,还可以用我最喜欢的Comic Sans MS字体,还支持代码收缩等等。
虽然比较慢,但是不像VC6. 0那样老是出现编译死机的情况。
开始用VC2005学习写东西的时候的感受:实在没有6.0好用,限制太多,很多地方跟VC6. 0不一样,而且很多功能似乎都找不到了。
还不如6.0方便。
使用一段时间的感受:虽然经常遇到问题但是都是有很好的解决方案的,而且相对6.0,2005的BUG少很多,总体来说如果机器配置还算可以的话,用2005是挺不错的。
下面就是我使用VC2005遇到的以及解决了的问题:VC遇到的以及解决了的问题1,对于Radio控件如何正确设置属性Group?首先要确保几个Radio控件的Tab是按顺序的(可以在对话框编辑器中按Ctrl+D将三个控件T ABORDER设置在一起)。
然后对第一个Radio控件选择Group属性,其他的不用选。
对第一个控件添加关联变量int m_test,并且设置初值-1,则当我们点击第一个控件m_test值是0,点击第二个m_test值是1....依此类推。
2,VC2005中添加虚函数问题:在VC6.0中可以对类右键添加虚函数,在VC2005中需要在类属性中点击一个重写按钮,在那里添加虚函数。
3,VC2005动态添加右键菜单问题:在VC6.0中我们可以在Project->Add To Project->Component and Control中添加组件,如添加Pop-up Menu可以实现添加右键快捷菜单的功能。
但是在VC2005中我们没有这个功能,但是我们可以手动自己添加,也不是很复杂。
步骤如下(假设工程是一般MFC视图工程命名Menu):1,自己添加一个Menu资源,例如命名为IDR_MENU1,编辑之。
VS2005编译常见错误汇总(更新按照公司文档模板)
VS 2005常见编译错误汇总在开发DS02H 项目中,总结了一些编译时较常遇到的编译错误1. fatal error C1010: unexpected end of file while looking for precompiled headerdirective中文翻译:寻找预编译头文件路径时遇到了不该遇到的文件尾。
解决:一般是没有#include "stdafx.h"2. fatal error C1083: Cannot open include file: 'C…….h': No such file ordirectory中文翻译:不能打开包含文件“C…….h”解决:检查文件名是否有错。
3. error C2011: 'C……': 'class' type redefinition中文翻译:类“C……”重定义。
解决:看是否重名了,去掉一个定义4. error C2018: unknown character '0xa3'中文翻译:不认识的字符'0xa3'。
解决:检查是否使用了汉字或中文标点符号5. error C2057: expected constant expression中文翻译:希望是常量表达式。
解决:使用常量表达式,特别注意出现在switch语句的case分支中务必要使用常量表达式6. error C2065: 'IDC_BTN_ENTER' : undeclared identifier“IDC_BTN_ENTER”:中文翻译:未声明过的标识符。
解决:要先定义后才能使用7. error C2082: redefinition of formal parameter 'bFlag'中文翻译:函数参数“bFlag”在函数体中重定义。
解决:去掉第二个定义8. error C2143: syntax error: missing ':' before '{'中文翻译:句法错误:“{”前缺少“;”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
already defined in *.obj“符号已定义”问题原理及解决方案C++Base 2010-06-15 15:08:25 阅读103 评论0 字号:大中小订阅造成LNK2005错误主要有以下几种情况:1.重复定义全局变量。
可能存在两种情况:A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。
其实这是错误的,全局变量是针对整个工程的。
正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test 即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj。
切记的就是不能给变量赋值否则还是会有LNK2005错误。
这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义:(1)声明必须使用extern关键字;(2)不能给变量赋初值所以,下面的是声明:extern int a;下面的是定义int a; int a = 0; extern int a =0;B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。
2.头文件的包含重复。
往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。
解决办法是在需要包含的头文件中做类似的处理:#ifndef MY_H_FILE //如果没有定义这个宏#define MY_H_FILE //定义这个宏…….//头文件主体内容…….#endif上面是使用宏来做的,也可以使用预编译来做,在头文件中加入:#pragma once//头文件主体3.使用第三方的库造成的。
这种情况主要是C运行期函数库和MFC的库冲突造成的。
具体的办法就是将那个提示出错的库放到另外一个库的前面。
另外选择不同的C函数库,可能会引起这个错误。
微软和C有两种C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。
另外一种是支持多线程的:msvcrt.lib。
如果一个工程里,这两种函数库混合使用,可能会引起这个错误,一般情况下它需要MFC的库先于C运行期函数库被链接,因此建议使用支持多线程的msvcrt.lib。
所以在使用第三方的库之前首先要知道它链接的是什么库,否则就可能造成LNK2005错误。
如果不得不使用第三方的库,可以尝试按下面所说的方法修改,但不能保证一定能解决问题,前两种方法是微软提供的:A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore libraries 的Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。
然后在Object/library Modules的Edit 栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序,呵呵,God bless you!B、选择VC菜单Project->Settings->Link页,然后在Project Options 的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。
C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code Generation后再在User Runtime libraray中选择MultiThread DLL 等其他库,逐一尝试。
关于编译器的相关处理过程,参考:/xzwenlan/archive/2004/12/23/211668.aspx这就是我所遇到过的LNK2005错误的几种情况,肯定还有其他的情况也可能造成这种错误,所以我不希望你在看完这篇文章以后,再遇到LNK2005错误时候,不动脑筋的想对号入座的排除错误。
编程的过程就是一个思考的过程,所以还是多多开动你的头脑,那样收获会更多!附录:编译器处理相关一.预处理器-编译器-汇编器-链接器预处理器会处理相关的预处理指令,一般是以"#"开头的指令。
如:#include "xx.h" #define等。
编译器把对应的*.cpp翻译成*.s文件(汇编语言)。
汇编器则处理*.s生成对应的*.o文件(obj目标文件)最后链接器把所有的*.o文件链接成一个可执行文件(?.exe)1.部件:首先要知道部件(可以暂且狭义地理解为一个类)一般分为头文件(我喜欢称为接口,如:*.h)及实现文件(如:*.cpp)。
一般头文件会是放一些用来作声明的东东作为接口而存在的。
而实现文件主要是实现的具体代码。
2.编译单个文件:记住IDE在bulid文件时只编译实现文件(如*.cpp)来产生obj,在vc下你可以对某个?.cpp按下ctrl+f7单独编译它生成对应一个?.obj文件。
在编译?.cpp时IDE会在?.cpp中按顺序处理用#include包括进来的头文件(如果该头文件中又#include有文件,同样会按顺序跟进处理各个头文件,如此递归。
)3.内部链接与外部链接:内、外链接是比较基础的东东,但是也是新手最容易错的地方,所以这里有必要祥细讨论一下。
内部链接产生的符号只在本地?.obj中可见,而外部链接的符号是所有*.obj之间可见的。
如:用inline的是内部链接,在文件头中直接声明的变量、不带inline的全局函数都是外部链接。
在文件头中类的内部声明的函数(不带函数体)是外部链接,而带函数体一般会是内部链接(因为IDE会尽量把它作为内联函数) 认识内部链接与外部链接有什么作用呢?下面用vc6举个例子:// 文件main.cpp内容:void main(){}// 文件t1.cpp内容:#include "a.h"void Test1(){ Foo(); }// 文件t2.cpp内容:#include "a.h"void Test2(){ Foo(); }// 文件a.h内容:void Foo( ){ }好,用vc生成一个空的console程序(File - new - projects - win32 console application),并关掉预编译选项开关(project - setting - Cagegoryrecompiled Headers - Not using precompiled headers)现在你打开t1.cpp按ctrl+f7编译生成t1.obj通过打开t2.cpp按ctrl+f7编译生成t2.obj通过而当你链接时会发现:Linking...t2.obj : error LNK2005: "void __cdecl Foo(void)" (?Foo@@YAXXZ) already defined in t1.obj这是因为:1. 编译t1.cpp在处理到#include "a.h"中的Foo时看到的Foo函数原型定义是外部链接的,所以在t1.obj中记录Foo符号是外部的。
2. 编译t2.cpp在处理到#include "a.h"中的Foo时看到的Foo函数原型定义是外部链接的,所以在t2.obj中记录Foo符号是外部的。
3. 最后在链接t1.obj 及t2.obj 时, vc发现有两处地方(t1.obj和t2.obj中)定义了相同的外部符号(注意:是定义,外部符号可以多处声明但不可多处定义,因为外部符号是全局可见的,假设这时有t3.cpp声明用到了这个符号就不知道应该调用t1.obj中的还是t2.obj中的了),所以会报错。
解决的办法有几种:a.将a.h中的定义改写为声明,而用另一个文件a.cpp来存放函数体。
(提示:把上述程序改来试试)(函数体放在其它任何一个cpp中如t1.cpp也可以,不过良好的习惯是用对应cpp文件来存放)。
这时包括a.h的文件除了a.obj中有函数体代码外,其它包括a.h的cpp生成的obj文件都只有对应的符号而没有函数体,如t1.obj、t2.obj就只有符号,当最后链接时IDE会把a.obj的Foo()函数体链接进exe文件中,并把t1.obj、t2.obj中的Foo符号转换成对应在函数体exe文件中的地址。
另外:当变量放在a.h中会变成全局变量的定义,如何让它变为声明呢?例如: 我们在a.h中加入:class CFoo{};CFoo* obj;这时按f7进行build时出现:Linking...t2.obj : error LNK2005: "class CFoo * obj" (?obj@@3PA VCFoo@@A) already defined in t1.obj一个好办法就是在a.cpp中定义此变量( CFoo* obj,然后拷贝此定义到a.h文件中并在前面加上extern(extern CFoo* obj如此就可通过了。
当然extern也可以在任何调用此变量的位置之前声明,不过强烈建议不要这么作,因为到处作用extern,会导致接口不统一。
良好的习惯是接口一般就放到对应的头文件。
b. 将a.h中的定义修改成内部链接,即加上inline关键字,这时每个t1.obj和t2.obj都存放有一份Foo函数体,但它们不是外部符号,所以不会被别的obj文件引用到,故不存在冲突。
(提示:把上述程序改来试试)另外我作了个实验来验证”vc是把是否是外部符号的标志记录在obj文件中的“(有点绕口)。
可以看看,如下:(1)文件内容:// 文件main.cpp内容:void main(){}// 文件t1.cpp内容:#include "a.h"void Test1(){ Foo(); }// 文件t2.cpp内容:#include "a.h"void Test2(){ Foo(); }// 文件a.h内容:inline void Foo( ){ }(2) 选t1.cpp按ctrl+f7单独编译,并把编译后的t1.obj修改成t1.obj_inline(3) 选t2.cpp按ctrl+f7单独编译,并把编译后的t2.obj修改成t2.obj_inline(4) 把除了t1.obj_inline及t2.obj_inline外的其它编译生成的文件删除。