(转)
今天在将两个人的VC6的代码合并到一起的时候,编译出现错误:
LIBCMT.lib(dosmap.obj) : error LNK2005: __dosmaperr already defined in LIBCD.lib(dosmap.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: __tolower already defined in LIBCD.lib(tolower.obj)
LIBCMT.lib(tolower.obj) : error LNK2005: _tolower already defined in LIBCD.lib(tolower.obj)
就是链接库中有重复定义的函数。Google了一下发现这是个挺普遍的问题。给出了很多种解决方法:
1)将所有用到的系统级链接库copy到私有目录中,作为私有的dll编译,不使用系统的。——这个方法没有尝试,因为它麻烦了,得确定复制所需要的dll,呵呵。
2)通过在Project——Setting——Link——Project Options中增加编译开关/verbose:lib可以显示详细的库链接顺序,了解具体是哪里的链接库文件出现问题。发现是Searching C:/Program Files/Microsoft Visual Studio/VC98/LIB/LIBCMT.lib:的。
使用/NODEFAULTLIB: LIBCMT.lib /NODEFAULTLIB: LIBCD.lib的编译参数,不检查相应的链接库内容。——但是我使用的时候不好用,出现大量找不到函数名的错误,所以也放弃了。
下面是一张可能发生冲突的列表,若要使用此运行时库 请忽略这些库:(摘自http://www.vckbase.com/bbs/prime/viewprime.asp?id=680)
单线程:(libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
多线程:(libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
使用 DLL 的多线程:(msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
调试单线程:(libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
调试多线程:(libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
使用 DLL 的调试多线程:(msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
3)使用 #pragma comment(linker,"/FORCE:MULTIPLE") 或者在编译时添加/FORCE:MULTIPLE参数。——问题解决了,但是因为我对VC不是很了解,所以不知道根本的原因。
我的最后采用了方法三,所有的error都变成了warning,编译成功。。。