Qt5.15静态编译+CMake构建+MSVC
1. 环境
Qt: 5.15.2(静态编译),怎么完成静态编译,网上有教程,此处不赘述 MSVC: VS2019 CMake: 3.19.0, 安装Qt时自动安装好的
2. Qt静态库目录
我编译的Qt5静态库版本是5.15.2,因此我将其拷贝到我的Qt安装目录下的 E:Qt5.15.2 位置中,并重命名为 static_msvc2019_64。
3. 设置静态库的kit(一般将怎么静态编译的文章都有讲)
-
请注意,这里的 Qt versions 一定要选择你静态编译的那个,否则编译出来的还是链接的共享库
4. 新建一个CMake构建的Qt项目
具体如何创建项目不赘述,可以看到CMake生成项目没问题。 但是一旦使用F5调试或者生成可执行文件就会报 LNK2038 的错误: 这是因为CMake链接的是动态库,在MSVC环境下,各种环境变量均是 /MD 的,如果是在VisualStudio中,可以通过设置项目属性来将其改成 /MT,但是在Qt中明显不能这么干,需要全部通过CMake来完成,因此我们需要手动修改环境变量来实现。将下面这段代码添加到QtCreator生成的 CMakeLists.txt 文件中的合适位置即可。
if(MSVC)
# Use the static C library for all build types
foreach(var
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
if(${var} MATCHES "/MD")
string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
endif()
endforeach()
endif(MSVC)
此时就可以顺利生成可执行文件啦,并且将可执行文件拷贝到其他位置也可以顺利执行。
