You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用QML构建Qt桌面应用时静态编译失败求助

问题:Qt 6静态编译时libGLX链接失败

我基于Qt 6.2.0开发桌面应用,UI用QML资源文件实现。尝试生成静态编译版本时,因缺少libGLX.a失败;尝试链接动态库libGLX.so时出现如下错误:

user@BTLinux:~/FMSApp$ make
[ 11%] Automatic MOC and UIC for target FMS
[ 11%] Built target FMS_autogen
[ 22%] Linking CXX executable FMS
/usr/bin/ld: attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libGLX.so'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/FMS.dir/build.make:444: FMS] Error 1
make[1]: *** [CMakeFiles/Makefile2:84: CMakeFiles/FMS.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

环境与配置

  • 使用在线安装的Qt Creator
  • CMakeLists.txt内容:
cmake_minimum_required(VERSION 3.16) 

# Set a custom variable for the home directory
set(HOME_DIRECTORY $ENV{HOME})

# Set the project name and version
project(FMSApp VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)

# Find the Qt libraries
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets Qml Charts)

# Add the executable
qt_add_executable(FMS
    src/main.cpp
    src/ZmqSubscriber.cpp
    src/ZmqSubscriber.h
    fmsapp.qrc
)

Set(-DQT_DEBUG_FIND_PACKAGE=ON)
set(ZMQ_INCLUDE_DIR ${HOME_DIRECTORY}/FMSApp/include)
set(ZMQ_LIB_DIR ${HOME_DIRECTORY}/FMSApp/libs/desktop/libzmq.a)

# Link the Qt libraries and ZeroMQ to the target
target_link_libraries(FMS
    PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::Qml
    Qt6::Charts
    ${ZMQ_LIB_DIR}
)

# Exclude specific libraries from static linking
find_library(GLX_LIB NAMES GLX)
find_library(GL_LIB NAMES GL)

target_link_libraries(FMS PRIVATE ${GLX_LIB} ${GL_LIB})

set_property(TARGET FMS APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/android)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bdynamic -lGL -lGLX -Wl,-Bstatic")
  • 执行的cmake命令:
cmake -S /home/user/FMSApp -B /home/user/FMSApp/build/Qt_Static-Release -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/home/user/qt-everywhere-src-6.7.2/build-static -DQT_QMAKE_EXECUTABLE=/home/user/qt-everywhere-src-6.7.2/build-static/bin/qmake -G "Unix Makefiles"

解决建议

1. 调整链接器flags顺序

当前CMAKE_EXE_LINKER_FLAGS的顺序会导致静态链接开关覆盖动态链接设置,修改为精准控制模式:

target_link_libraries(FMS
    PRIVATE
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::Qml
    Qt6::Charts
    ${ZMQ_LIB_DIR}
    # 显式指定GL/GLX使用动态链接
    "-Wl,-Bdynamic" ${GLX_LIB} ${GL_LIB} "-Wl,-Bstatic"
)

或者调整全局flags的顺序逻辑:

# 先全局静态链接,再单独指定GL/GLX动态链接
set(CMAKE_EXE_LINKER_FLAGS "-Wl,-Bstatic")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bdynamic -lGL -lGLX")

2. 安装GLX静态库(如需静态链接)

如果必须静态链接GLX,在Debian/Ubuntu系统执行以下命令安装静态开发包:

sudo apt-get install libglx-dev libgl1-mesa-dev

安装完成后重新运行cmake和make,即可找到libGLX.a。

3. 修正CMakeLists中的无效指令

删除Set(-DQT_DEBUG_FIND_PACKAGE=ON),该指令是cmake命令行参数,不能写在CMakeLists.txt中。

4. 检查Qt静态构建配置

确保编译Qt静态库时启用了X11与GL相关模块,编译Qt时需添加-qt-xcb参数,否则静态Qt库会缺失GLX链接支持。

5. 统一Qt版本

你应用基于Qt 6.2.0开发,但静态构建使用Qt 6.7.2源码包,版本差异可能引发兼容性问题。建议使用与应用开发版本一致的Qt源码进行静态编译。


内容的提问来源于stack exchange,提问作者user22615348

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 19:51:07