问题描述
比如我们的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静态库默认启用该选项。

发表回复