Qt静态编译常见问题及解决方案
Qt静态编译常见问题及解决方案
在Qt开发中,静态编译是一个重要的技术环节,它允许开发者将所有依赖库打包到一个可执行文件中,从而在没有安装Qt运行时的系统上运行应用程序。然而,在进行静态编译时,开发者经常会遇到各种令人头疼的错误。本文将详细介绍Qt静态编译中常见的问题及其解决方案,帮助开发者顺利进行静态编译。
MSYS2环境下32位Qt源码编译错误
在使用MSYS2环境编译32位Qt源码并添加openssl支持时,可能会遇到以下错误:
_uuidof was not declared in this scope
这个错误通常出现在src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp
文件中。要解决这个问题,可以按照以下步骤操作:
- 打开
src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp
文件 - 将所有
_uuidof
替换为__uuidof
- 打开
src/plugins/scenegraph/d3d12/qsgd3d12engine_p_p.h
文件 - 在文件开头添加
#include <d3d12sdklayers.h>
头文件 - 将
static const int
替换为static inline const int
例如,将以下代码:
static const int MAX_SWAP_CHAIN_BUFFER_COUNT = 4;
static const int MAX_FRAME_IN_FLIGHT_COUNT = 4;
修改为:
static inline const int MAX_SWAP_CHAIN_BUFFER_COUNT = 4;
static inline const int MAX_FRAME_IN_FLIGHT_COUNT = 4;
Qt Creator静态编译配置
在Qt Creator中进行静态编译的基本步骤如下:
- 打开Qt Creator并创建一个新项目或打开现有项目
- 在项目配置中,选择“Build & Run”选项卡
- 在“qmake”部分,修改“qmake”参数,添加
-static
标志以启用静态编译 - 在“Build steps”中,确保使用静态编译器进行编译
- 在“Deploy steps”(仅适用于跨平台部署)中,确保包含所有必要的静态库文件
此外,你还可以通过直接修改项目文件(如.pro
文件)来启用静态编译。在项目文件中添加以下行:
CONFIG += static
这将告诉qmake生成静态链接的应用程序。
添加openssl支持
在编译Qt源码时,如果需要包含openssl支持,需要先编译openssl库,并将其路径添加到Qt的编译选项中。以下是静态编译Qt时添加openssl支持的步骤:
下载并编译openssl库。可以从openssl官网下载最新源码包,例如
openssl-1.1.1i.tar.gz
。解压缩后,进入目录,执行以下命令进行编译:./config no-shared --prefix=/path/to/openssl make && make install
在配置Qt编译时,添加
-openssl-linked
选项,并指定openssl库的路径。例如:./configure -confirm-license -opensource -platform win32-g++ -mp -release -static -openssl-linked -prefix /f/Qt/Static -qt-sqlite -qt-zlib -qt-libjpeg -qt-libpng -qt-freetype -opengl desktop -no-qml-debug -no-angle -nomake tests -nomake examples -skip qtwebengine -skip qtwebview -skip qt3d
使用MinGW 11.2编译Qt
使用MinGW 11.2编译Qt时,可能会遇到一些问题。以下是一些常见的解决方案:
解决
struct _FILE_ID_INFO
重复定义问题:在
qtbase/src/corelib/io/qfilesystemengine_win.cpp
文件的667行,将:#if defined(Q_CC_MINGW) && WINVER < 0x0602 // Windows 8 onwards typedef struct _FILE_ID_INFO { ULONGLONG VolumeSerialNumber; FILE_ID_128 FileId; } FILE_ID_INFO, *PFILE_ID_INFO; #endif // if defined (Q_CC_MINGW) && WINVER < 0x0602
修改为:
#if defined(Q_CC_MINGW) && WINVER < 0x0602 && !(_WIN32_WINNT >= _WIN32_WINNT_WIN8) // Windows 8 onwards typedef struct _FILE_ID_INFO { ULONGLONG VolumeSerialNumber; FILE_ID_128 FileId; } FILE_ID_INFO, *PFILE_ID_INFO; #endif // if defined (Q_CC_MINGW) && WINVER < 0x0602
解决fxc.exe找不到的问题:
使用系统搜索工具查找fxc.exe文件,并设置环境变量:
set path=%path%;C:\Program Files (x86)\Windows Kits\10\bin\u0064
解决D3D12相关错误:
在
src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp
文件中,进行以下修改:diff --git a/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp b/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp index 75bde2c66b..3594878eca 100644 --- a/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp +++ b/src/plugins/scenegraph/d3d12/qsgd3d12engine.cpp @@ -221,7 +221,7 @@ static void getHardwareAdapter(IDXGIFactory1 *factory, IDXGIAdapter1 **outAdapte if (SUCCEEDED(factory->EnumAdapters1(adapterIndex, &adapter))) { adapter->GetDesc1(&desc); const QString
通过以上解决方案,开发者可以有效地解决Qt静态编译过程中遇到的常见问题。在实际开发中,如果遇到其他问题,建议仔细检查错误信息,分析问题原因,并根据具体情况进行相应的处理。同时,保持开发环境的整洁和配置的正确性也是避免问题的关键。