好久没来更新了,这里已是灰尘密布,都快进不来人了。这篇小札就当是扫灰吧。
最近要给程序增加一点新功能,经过大体的设计后,添加了一个类和该类的一个全局对象。然后就是加方法、调试测试,等弄的差不多了就放心地撂下了。
过了没两天,再打开准备进一步修改的时候,发现链接通不过了,提示有两个OBJ文件LNK2019 LNK2001——又是经典的UNRESOLVED SYMBOL问题。
源代码、工程设置里都找了,没发现什么线索,更是觉得难以置信:因为记忆中从上次链接执行到出问题根本就没作过什么重大修改——只是润色代码格式、加个TAB或删个空行之类的怎么也不会产生这种错误。
重新完全链接,编译器也丝毫不为之所动,一点改观没有。
到这,开发陷入僵局。
我是最怕这种情况的,因为不知道会耽搁多久。
只能怪自己基础知识不过硬,不能一眼发现问题所在,没办法,只有一点一点地毯试搜索了。我试着把牵涉问题的两个源代码文件一点一点地注释掉,编译链接,如果没问题再缩小注释范围,再链接,如此反复。中间也试着DUMPBIN生成的链接通不过的OBJ文件,怎奈茫茫符号,不知道哪个是我要找的。。。
最后,还是地毯试搜索发挥了作用,原来是不知道什么时候我把新添加类的两个成员函数定义前面加了INLINE,而去掉INLINE就什么问题都没有了。而到这个时候,时间已经过去了一天半!
不过,还是搞不明白,为什么INLINE后就找不到函数定义了。比较了一下INLINE前后在OBJ文件上执行DUMPBIN /SYMBOLS的输出,果然加了INLINE后,对应的函数符号就没了!?
找出 THINKING IN C++,把INLINE的那一章大致读了一便,也没发现有这方面的说明。
另:不知道是我的环境设置不对还是什么,VS2003发出LNK2019,LNK2001之类提示时,却不告诉我是哪个/哪写符号不能解析,否则也不会盲目找了,而以前在VC6里是有的。这难道不应该是LINKER的一个基本功能吗?