MSVC不同运行时混合编译的问题

·

问题描述

比如我们的EXE依赖zlib库,EXE的调试模式为/MDd,而zlib静态库是由/MT编译的,在这种情况下,编译EXE可以成功,但会得到如下提示。

1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library

此时可以按照警告信息,在EXE项目属性中设置忽略LIBCMT.LIB库,从而消除警告,但这个方法比较麻烦,需要修改每一个引用该库的程序。

更好的解决方法

造成上面的原因是因为zlib静态库指定了默认库,这一信息可以通过dumpbin查看。

dumpbin /directives zlibstat.lib

可以看到,默认库为LIBCMT。

删除默认库可以使用编译参数

/Zl

也可以在图形界面中修改 Omit Default Library Names属性。修改过后,使用dumpbin查看该lib可以发现/DEFAULTLIB为空。使用/MDd编译的EXE引用该库也不会有警告提示了。openssl静态库默认启用该选项。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注