起因:
程序是一个ocx工程,已经用在项目中了,很正常. 工程收尾的时候, 准备加入vss, 作为一个阶段性版本. 工程本身没动, 把调试程序时的外部依赖dll, exe这些二进制的东西删掉,减少体积, vss check in.
把原有工程删掉, 选了个新位置, vss check out.
再编译的时候,编译不过. 我明明没动源码工程, 怎么会这样呢? 以前遇到此类问题,就是不断的去实验调整Link选项.lib的顺序.有点茫然的感觉. 今天在MS官方站点上看到了一个方法, 解决问题的思路很清晰.
解决过程:
Link选项中加入/verbose:lib, 观察库链接顺序和Link出错位置.
库链接顺序和Link错误位置都看到了如下:
Searching Libraries Searching C:/Program Files/Microsoft Visual Studio/VC98/LIB/uuid.lib: Searching C:/Program Files/Microsoft Visual Studio/VC98/LIB/MSVCRT.lib: Searching C:/Program Files/Microsoft Visual Studio/VC98/LIB/OLDNAMES.lib: Searching C:/Program Files/Microsoft Visual Studio/VC98/MFC/LIB/mfc42.lib: Searching C:/Program Files/Microsoft Visual Studio/VC98/MFC/LIB/mfcs42.lib:mfcs42.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRT.lib(dllmain.obj) Searching C:/Program Files/Microsoft Visual Studio/VC98/LIB/kernel32.lib:
根据出错信息,调整Link库的设置如下:
编译通过, 心情很好,完全没有以前那种,摸着石头过河的感觉~
同一个工程集合中又一个子工程Link报错, 用这种方法解决问题的速度真快
我很纳闷,原始的工程,我源码和设置都没动过,怎么能出现以前编译过,现在不调整设置就编译不过呢?
<2011_1020>
找到了vs2005中设置/verbose:lib的地方