在Qt上构建静态程序

问题描述 投票:0回答:1

我已经在 Windows 上构建了 qt-6.6-static,我想构建一个或两个静态项目。我尝试构建一个示例程序“Scenegraph”,但它失败并显示错误消息。

C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Qt/6.6.0-static/plugins/networkinformation/libqnetworklistmanager.a(qnetworklistmanagerevents.cpp.obj):qnetworklistmanagerevents.cpp:(.text$_ZN25QNetworkListManagerEvents24checkBehindCaptivePortalEv+0x82): undefined reference to `__imp_VariantInit'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Qt/6.6.0-static/plugins/networkinformation/libqnetworklistmanager.a(qnetworklistmanagerevents.cpp.obj):qnetworklistmanagerevents.cpp:(.text$_ZN25QNetworkListManagerEvents24checkBehindCaptivePortalEv+0x98): undefined reference to `__imp_VariantClear'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Qt/6.6.0-static/plugins/networkinformation/libqnetworklistmanager.a(qnetworklistmanagerevents.cpp.obj):qnetworklistmanagerevents.cpp:(.text$_ZN25QNetworkListManagerEvents24checkBehindCaptivePortalEv+0x1d9): undefined reference to `__imp_VariantClear'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/Qt/6.6.0-static/plugins/networkinformation/libqnetworklistmanager.a(qnetworklistmanagerevents.cpp.obj):qnetworklistmanagerevents.cpp:(.text$_ZN25QNetworkListManagerEvents24checkBehindCaptivePortalEv+0x24d): undefined reference to `__imp_VariantClear'
collect2.exe: error: ld returned 1 exit status 

我使用的编译器是gcc 13.2.0

显然这表明我应该链接到 oleaut32.lib 但 qt 文件已经这样做了。在调试模式下测试了 oleaut lib,它似乎正在工作。

QT += quick
QT += opengl
CONFIG += c++2a
CONFIG += static
QMAKE_CXXFLAGS += -std=c++2a
LIBS += -lgmp

SOURCES += \
    Squircle.cpp \
    glrenderer.cpp \
    main.cpp \

RESOURCES += \
    qml.qrc

qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

HEADERS += \
    Squircle.h \
    glrenderer.h \

DISTFILES += main.qml

还有其他人为此苦苦挣扎吗?除了“使用动态构建”之外还有其他解决方案吗?

//由于评论而添加编辑

我忘了提及,我已尝试添加链接 LIBS +=-loleaut32 仍然遇到相同的错误。

这也是一些编译输出。所以链接肯定已经存在了。

libqwindows.a -ldwmapi -limm32 -loleaut32 -lsetupapi -lshlwapi -lwinspool
lib/libQt6Network.a -lbrotlidec -lbrotlicommon 
c++ windows qt
1个回答
0
投票

我的解决方案是将 -loleaut32 添加到 /plugins/networkinformation/qnetworklistmanager.prl 中的 lib 依赖项列表(QMAKE_PRL_LIBS)

或者,问题的根源似乎是Src/qtbase/src/plugins/networkinformation/networklistmanager/CMakeLists.txt中Windows上的额外库依赖项只考虑了MSVC编译器

更改此行:

qt_internal_extend_target(QNLMNIPlugin CONDITION MSVC

qt_internal_extend_target(QNLMNIPlugin CONDITION MSVC OR WIN32

再次构建静态qt也解决了这个问题。但我不知道如何处理 CMakeLists 文件,这可能不是一个“好的”解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.