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)

此时就可以顺利生成可执行文件啦,并且将可执行文件拷贝到其他位置也可以顺利执行。

经验分享 程序员 微信小程序 职场和发展