转帖:http://blog.csdn.net/whygosofar/article/details/2821875
MSDN中对于在不同的配置下Link的LIB作了说明:
C Runtime Library:
开关 |
对应的库 |
版本 |
/MD |
MSVCRT.LIB |
多线程DLL的Release版本 |
/MDd |
MSVCRTD.LIB |
多线程DLL的Debug版本 |
/MT |
LIBCMT.LIB |
多线程静态链接的Release版本 |
/MTd |
LIBCMTD.LIB |
多线程静态链接的Debug版本 |
/clr |
MSVCMRT.LIB |
托管代码和非托管代码混合 |
/clr:pure |
MSVCURT.LIB |
纯托管代码 |
C++ Standard Library:
开关 |
对应的库 |
版本 |
/MD |
MSVCPRT.LIB |
多线程DLL的Release版本 |
/MDd |
MSVCPRTD.LIB |
多线程DLL的Debug版本 |
/MT |
LIBCPMT.LIB |
多线程静态链接的Release版本 |
/MTd |
LIBCPMTD.LIB |
多线程静态链接的Debug版本 |
编译器会自动根据编译选项,选择对应的LIB文件。一般情况下这不会出现问题。
然而,在部分情况下,一旦你的程序的各个部分(LIB, OBJ…)并非由相同的编译选项编译出,而Link在一起的话,会出现各种各样的看似很难解决的问题,这类问题主要以重复定义的错误形式存在,通常的解决方法也很简单,就是选择同样的编译选项进行编译之后再Link。
......................
来看看出问题的LIB是那些:
当前我们的配置是多线程DLL的Debug版,因此3和4是应该出现在link的列表中的,不属于多余。而后两者则是只是当多线程静态链接Release版中才会出现。这提示我在项目中加入的ANTLR.LIB可能是造成这个问题的根源,因为静态库的编译选项很容易和主程序发生冲突,并且根据实际信息我们可以看出ANTLR.LIB应该是用多线程静态链接的Release版本来编译的。
这样,解决方法就很清楚了:
做了这两个修改之后编译通过。
还有一种方法是,自己用多线程DLL的Debug版重新编译一次ANTLR,生成一个新的ANTLRD.LIB,再link这个Lib也可以解决这个问题。
VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结,布布扣,bubuko.com
VC运行库版本不同导致链接.LIB静态库时发生重复定义问题的一个案例分析和总结
原文:http://www.cnblogs.com/foohack/p/3835867.html