
-
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静态库默认启用该选项。

-
CMake Qt MinGW项目无法静态链接C++标准库的问题
在add_executable()之后加上target_link_libraries()就行了,用link_libraries()是不行的,必须用target_link_libraries()。
target_link_libraries(project_name PRIVATE libstdc++.a) target_link_libraries(project_name PRIVATE libpthread.a)
生成compile_commands.json文件,其中包含全部的编译参数。
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
-
MSYS2太好用了
- MSYS2 Packages
https://packages.msys2.org/package
安装mingw64工具链
pacman -S mingw-w64-ucrt-x86_64-toolchain pacman -S mingw-w64-i686-toolchain
清除缓存
pacman -Sc
更新系统
pacman -Syu
这个用起来会很方便,boost、zlib、openssl、curl、nghttp2等库都包含在内,并且版本基本都保持最新。
- Visual Studio Code的配置
-
MSVC和MinGW64编译boost
MinGW-w64
使用的是w64devkit-1.21.0。
生成b2.exe
bootstrap.bat gcc
编译
b2.exe toolset=gcc -–layout=versioned variant=debug link=static threading=multi runtime-link=static cxxstd=20 b2.exe toolset=gcc -–layout=versioned variant=release link=static threading=multi runtime-link=static cxxstd=20