如何解决“Invalid Address specified to RtlValidateHeap”错误?
SR4v N#z ?
找到了这篇文章:[url]http://hi.baidu.com/umu618/blog/item/d4e8242e424e3e564fc226d3.html[/url]
“一个可能的原因:在不同模块(工程)之间传递 C++ 类,而这两个模块用了不同的运行时库(Runtime Library)设置。例如:EXE 模块调用 DLL 模块里传递 C++ 类的函数,但 DLL 模块使用静态链接(Release 是 Multi-threaded (/MT) 、Debug 是 Multi-threaded Debug (/MTd) )方式编译,而 EXE 模块使用动态链接(Release 是 Multi-threaded DLL (/MD) 、Debug 是 Multi-threaded Debug DLL (/MDd) )方式编译。 +l'J6s?8Eqv~1^#`
:iCc d1|`
可以对比这两个模块的工程属性 - C/C++ - Code Generation - Runtime Library ,看看设置是否一样,如果不一样要改成一样的。“
P2E5_FX"Ei.i"L
二.把我的exe工程属性改成和dll一样的Multi-threaded Debug DLL (/MDd)后, lYKm-U
出现nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv T+X}]sj^
找到这篇文章:[url]http://blog.csdn.net/pbdwadr/archive/2007/09/07/1775675.aspx[/url],如下: 1Z l \?#n\.X%q ~;c
” 1. 【错误提示】: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main ON1_X K
【说 明】: Windows项目要使用Windows子系统, 而不是Console &C8fJ([]7TNF0o4k'co
【解决方法】:[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows N fb1N6E(y(v_&^*l7zq
2. 【错误提示】:LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 #?II5oT&iS
【说 明】:控制台项目要使用Console子系统, 而不是Windows +^ {*u.euu3@*tB
【解决方法】:[Project] --> [Settings] --> 选择"Link"属性页, G4` F x[
在Project Options中将/subsystem:windows改成/subsystem:console
e1pC}&a9p
3. 【错误提示】:msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 u#i2z&]1Q RI:h
【说 明】:通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入
口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口 9k Wf\1X/f*{i
【解决方法】:[Project] --> [Settings] --> 选择"C/C++"属性页, '^uQ+yY;zOWU%^
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
4. 【错误提示】: nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex )Ib1{5` p1{
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex &ReF/S'x
【说 明】:这是因为MFC要使用多线程时库
【解决方法】:[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation, Z9f$?2Mj{{
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中, 5mO,La#bI
Single-Threaded 单线程静态链接库(release版本) w I,^5Um
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本) _'B#C6`/br(r
Debug Multithreaded DLL 多线程动态链接库(debug版本) 5K N"??)q0B1~_3S5zd
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行 "K`I&d?;Z2?!Wm(G:c
release版本: 正式发布时使用 Xo I]4G6JJ
debug版本: 调试阶段使用 D!m e\5w,qq+f
{;H%R-EJ2wZ
5. 【错误提示】: Compiling... ,Error spawning cl.exe 4I k(])M|h\H
【说 明】:这个问题很多情况下是由于路径设置的问题引起的,“CL.exe”是VC使用真正 2}.NCm3Fh%GcZ
的编译器(编译程序),其路径在“VC根目录/VC98/Bin”下面,你可以到相
应的路径下找到这个应用程序。
【解决方法】:“TOOLS(工具)”—>“Option(选择)”—>“Directories(目录)” &N,Uc(`d/ah
重新设置“Excutable Fils、Include Files、Library Files、Source Files”的路径。 u5k)u-zTAhG
6. 【错误提示】: nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv
【说 明】:
【解决方法】:在Preprocessor中定义_AFXDLL z2FZ3E+[/I-^9Nf
7. 【错误提示】:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds d0C\l[~
【说 明】: t/ds8jcu
【解决方法】:/C++->Code Generation->Multithread DLL (即实现/MD选项) “ ;BUB\9E1\W
按照方法6解决
1])xZK[0E
三.一个相关的问题 nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in utility.obj c s*XyM%c*MeB
几种解决方法:(以前的笔记,忘记其中的一些原帖了)
1.
你只需要在工程设置里面,把 kVfdc*S h
WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL vM$c$uJB
/c4YE^g9Px:SF
中的_USRDLL,删除,就可以正确编译了 F!x'xx.f7fY
G+h MCWU~g
$B)Y HG2u6[i
另一种描述 (v i#ithj(t
X^#RtM"{![5N
nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined $m)F,rer-r(sU7Sq
google半天没搞定 M:T7d$h!WP9d
只好自己搞,最后将工程里面的_USRDLL宏定义去除,瞎猫碰到死耗子了,好了。
在afx.h中发现一段代码 Gp wfP U&p
#ifdef _USRDLL
#pragma comment(linker, "/include:__afxForceUSRDLL")
#endif
就我现在的水平,没看懂,留着以后慢慢看吧,呵呵! #T2Pm5_` _2s[/T,mv
A5s1O&{%n;~ Zx
6a8O&IY1Sp
2.Linker Tools Error LNK2005 symbol already defined in object #Uc7F3f N0l
The given symbol, displayed in its decorated form, was multiply defined. h2s@Ga`
Tips
One of the following may be a cause: k N/Wivm-T ~0v:R
The most common cause of this error is accidentally linking with both the single-threaded and multithreaded libraries. Ensure that the application project file includes only the appropriate libraries and that any third-party libraries have appropriately created single-threaded or multithreaded versions. %bzM"oIl
The given symbol was a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include the symbol. #s } ]1[.O9n?m+p
The given symbol was defined differently in two member objects in different libraries, and both member objects were used. d6d/`T_(z
0G3D eM#f]
An absolute was defined twice, with a different value in each definition.
+k+@V8Mg7bv:q$\
Linker Tools Error LNK1169 one or more multiply defined symbols found
VH;Qc3[
The build failed due to multiple definitions of one or more symbols. This error is preceded by error LNK2005. &x8p |Ds
qfH)L6eQ
The /FORCE or /FORCE:MULTIPLE option overrides this error.
4.官方解决方案 :[url]http://support.microsoft.com/kb/148652/zh-cn[/url]
在 Visual C++ 中以错误的顺序链接 CRT 库和 MFC 库时出现 LNK2005 错误
一个可能的原因:在不同模块(工程)之间传递 C++ 类,而这两个模块用了不同的运行时库(Runtime Library)设置。例如:EXE 模块调用 DLL 模块里传递 C++ 类的函数,但 DLL 模块使用静态链接(Release 是Multi-threaded (/MT)、Debug 是Multi-threaded Debug (/MTd))方式编译,而 EXE 模块使用动态链接(Release 是Multi-threaded DLL (/MD)、Debug 是Multi-threaded Debug DLL (/MDd))方式编译。
可以对比这两个模块的工程属性 - C/C++ - Code Generation - Runtime Library,看看设置是否一样,如果不一样要改成一样的。
如果无法解决问题,那就是别的原因了。
{
跨模块的内存管理,最好是由每个模块提供自己的分配和销毁机制,然后在模块外部通过这些接口的调用来控制对象的生命期,而不是随随便便的在外部new&delete。 当然微软提供了GlobalAlloc/GlobalFree这样的全局内存API,用它们的话跨模块也没有问题的。
具体到我手头的项目,由于反外挂和加壳的需求,最好是将所有的执行体做成一个exe而不是很多个dll。静态库的需求是迟早的,那就今天全换算了。全部换成lib链接后堆错误消失,成功。
}
{
Invalid Address specified to RtlValidateHeap
一.首先是”Invalid Address specified to RtlValidateHeap “SR4v N#z ?
找到了这篇文章:[url]http://hi.baidu.com/umu618/blog/item/d4e8242e424e3e564fc226d3.html[/url]
“一个可能的原因:在不同模块(工程)之间传递 C++ 类,而这两个模块用了不同的运行时库(Runtime Library)设置。例如:EXE 模块调用 DLL 模块里传递 C++ 类的函数,但 DLL 模块使用静态链接(Release 是 Multi-threaded (/MT) 、Debug 是 Multi-threaded Debug (/MTd) )方式编译,而 EXE 模块使用动态链接(Release 是 Multi-threaded DLL (/MD) 、Debug 是 Multi-threaded Debug DLL (/MDd) )方式编译。 +l'J6s?8Eqv~1^#`
:iCc d1|`
可以对比这两个模块的工程属性 - C/C++ - Code Generation - Runtime Library ,看看设置是否一样,如果不一样要改成一样的。“
P2E5_FX"Ei.i"L
二.把我的exe工程属性改成和dll一样的Multi-threaded Debug DLL (/MDd)后, lYKm-U
出现nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv T+X}]sj^
找到这篇文章:[url]http://blog.csdn.net/pbdwadr/archive/2007/09/07/1775675.aspx[/url],如下: 1Z l \?#n\.X%q ~;c
” 1. 【错误提示】: libcmtd.lib(crt0.obj) : error LNK2001: unresolved external symbol _main ON1_X K
【说 明】: Windows项目要使用Windows子系统, 而不是Console &C8fJ([]7TNF0o4k'co
【解决方法】:[Project] --> [Settings] --> 选择"Link"属性页,
在Project Options中将/subsystem:console改成/subsystem:windows N fb1N6E(y(v_&^*l7zq
2. 【错误提示】:LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16 #?II5oT&iS
【说 明】:控制台项目要使用Console子系统, 而不是Windows +^ {*u.euu3@*tB
【解决方法】:[Project] --> [Settings] --> 选择"Link"属性页, G4` F x[
在Project Options中将/subsystem:windows改成/subsystem:console
e1pC}&a9p
3. 【错误提示】:msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16 u#i2z&]1Q RI:h
【说 明】:通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, 程序入
口必须改为wWinMainCRTStartup, 所以需要重新设置程序入口 9k Wf\1X/f*{i
【解决方法】:[Project] --> [Settings] --> 选择"C/C++"属性页, '^uQ+yY;zOWU%^
在Category中选择Output,
再在Entry-point symbol中填入wWinMainCRTStartup, 即可
4. 【错误提示】: nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex )Ib1{5` p1{
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex &ReF/S'x
【说 明】:这是因为MFC要使用多线程时库
【解决方法】:[Project] --> [Settings] --> 选择"C/C++"属性页,
在Category中选择Code Generation, Z9f$?2Mj{{
再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中, 5mO,La#bI
Single-Threaded 单线程静态链接库(release版本) w I,^5Um
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本) _'B#C6`/br(r
Debug Multithreaded DLL 多线程动态链接库(debug版本) 5K N"??)q0B1~_3S5zd
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行 "K`I&d?;Z2?!Wm(G:c
release版本: 正式发布时使用 Xo I]4G6JJ
debug版本: 调试阶段使用 D!m e\5w,qq+f
{;H%R-EJ2wZ
5. 【错误提示】: Compiling... ,Error spawning cl.exe 4I k(])M|h\H
【说 明】:这个问题很多情况下是由于路径设置的问题引起的,“CL.exe”是VC使用真正 2}.NCm3Fh%GcZ
的编译器(编译程序),其路径在“VC根目录/VC98/Bin”下面,你可以到相
应的路径下找到这个应用程序。
【解决方法】:“TOOLS(工具)”—>“Option(选择)”—>“Directories(目录)” &N,Uc(`d/ah
重新设置“Excutable Fils、Include Files、Library Files、Source Files”的路径。 u5k)u-zTAhG
6. 【错误提示】: nafxcw.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argv
【说 明】:
【解决方法】:在Preprocessor中定义_AFXDLL z2FZ3E+[/I-^9Nf
7. 【错误提示】:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds d0C\l[~
【说 明】: t/ds8jcu
【解决方法】:/C++->Code Generation->Multithread DLL (即实现/MD选项) “ ;BUB\9E1\W
按照方法6解决
1])xZK[0E
三.一个相关的问题 nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in utility.obj c s*XyM%c*MeB
几种解决方法:(以前的笔记,忘记其中的一些原帖了)
1.
你只需要在工程设置里面,把 kVfdc*S h
WIN32,NDEBUG,_WINDOWS,_MBCS,_USRDLL,MSGBOX_EXPORTS,_WINDLL,_AFXDLL vM$c$uJB
/c4YE^g9Px:SF
中的_USRDLL,删除,就可以正确编译了 F!x'xx.f7fY
G+h MCWU~g
$B)Y HG2u6[i
另一种描述 (v i#ithj(t
X^#RtM"{![5N
nafxcwd.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined $m)F,rer-r(sU7Sq
google半天没搞定 M:T7d$h!WP9d
只好自己搞,最后将工程里面的_USRDLL宏定义去除,瞎猫碰到死耗子了,好了。
在afx.h中发现一段代码 Gp wfP U&p
#ifdef _USRDLL
#pragma comment(linker, "/include:__afxForceUSRDLL")
#endif
就我现在的水平,没看懂,留着以后慢慢看吧,呵呵! #T2Pm5_` _2s[/T,mv
A5s1O&{%n;~ Zx
6a8O&IY1Sp
2.Linker Tools Error LNK2005 symbol already defined in object #Uc7F3f N0l
The given symbol, displayed in its decorated form, was multiply defined. h2s@Ga`
Tips
One of the following may be a cause: k N/Wivm-T ~0v:R
The most common cause of this error is accidentally linking with both the single-threaded and multithreaded libraries. Ensure that the application project file includes only the appropriate libraries and that any third-party libraries have appropriately created single-threaded or multithreaded versions. %bzM"oIl
The given symbol was a packaged function (created by compiling with /Gy) and was included in more than one file but was changed between compilations. Recompile all files that include the symbol. #s } ]1[.O9n?m+p
The given symbol was defined differently in two member objects in different libraries, and both member objects were used. d6d/`T_(z
0G3D eM#f]
An absolute was defined twice, with a different value in each definition.
+k+@V8Mg7bv:q$\
Linker Tools Error LNK1169 one or more multiply defined symbols found
VH;Qc3[
The build failed due to multiple definitions of one or more symbols. This error is preceded by error LNK2005. &x8p |Ds
qfH)L6eQ
The /FORCE or /FORCE:MULTIPLE option overrides this error.
4.官方解决方案 :[url]http://support.microsoft.com/kb/148652/zh-cn[/url]
在 Visual C++ 中以错误的顺序链接 CRT 库和 MFC 库时出现 LNK2005 错误
}