在把一个解决方案编译成release版的过程中。遇到了一个非常难缠的bug
3>libcpmtd.lib(xdebug.obj) : error LNK2001: unresolved external symbol __malloc_dbg
3>libcpmtd.lib(xdebug.obj) : error LNK2001: unresolved external symbol __free_dbg
我的解决方案里很多项目都是公共的,很多解决方案release版没有问题,惟独一个openMSX项目报出如上错误。
然后我将libcpmtd.lib屏蔽后,出现
1>std_r.lib(ConsoleCtrl.obj) : error LNK2001: unresolved external symbol "void * __cdecl operator new[](unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (??_U@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z)
1>std_r.lib(ConsoleCtrl.obj) : error LNK2001: unresolved external symbol "struct std::_DebugHeapTag_t const & __cdecl std::_DebugHeapTag_func(void)" (?_DebugHeapTag_func@std@@YAABU_DebugHeapTag_t@1@XZ)
错误。打开consoleCtrl.h发现里面引入了#include <iostream>。怀疑是与其他类似于#include <stdio.h>之类的冲突造成的。故而去掉#include <iostream>引用以后,问题不在出现.(libcpmtd.lib也不必屏蔽)
--------------------------------------------------------------
最后仔细研读代码发现,其他项目都不是控制台项目.只有OpenMSX是控制台项目,在OPenMSX.exe项目中使用了std项目的一个cls()控制台清屏函数造成的。这个函数在ConsoleCtrl.H下定义。找到问题后,解决就变得容易多了.
-------------------------------------------------------------------------------------
cls()函数中使用了system("cls"),而system函数的定义是在 stdlib.h中。 我怀疑#include <iostream>也包含了system函数的定义(因为之前consoleCtrl中并未引入stdlib而是引入了<iostream>,debug版中cls()函数工作正常,只是release版中有连接错误)