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

如何让CMake仅链接Qt5而非Qt4,解决libQtGui.so缺失报错

问题根源

编译报错是因为生成的链接项中混入了Qt4的libQtGui.so(Qt5对应库为libQt5Gui.so),该文件不存在。这是由于Geant4或ROOT包默认引入了Qt4依赖,与你手动添加的Qt5依赖冲突导致的。

解决方案

1. 强制Geant4使用Qt5

Geant4支持Qt5作为可视化后端,修改find_package(Geant4)的调用,明确指定使用Qt5:

# 先设置强制使用Qt5的缓存变量
set(GEANT4_USE_QT5 ON CACHE BOOL "Use Qt5 for Geant4 visualization")
find_package(Geant4 REQUIRED)

或者直接在find_package中指定qt5组件:

find_package(Geant4 REQUIRED qt5)

2. 清理CMake缓存后重新配置

旧的CMake缓存可能残留Qt4的配置信息,必须彻底清理后重新生成:

cd 你的build目录
rm CMakeCache.txt
rm -rf CMakeFiles/
cmake ../

3. 排查ROOT的Qt依赖(若上述方法无效)

如果ROOT包引入了Qt4链接项,可先打印ROOT的库列表确认:

message(STATUS "ROOT linked libraries: ${ROOT_LIBRARIES}")

若发现包含Qt4相关库,可尝试在查找ROOT时禁用Qt组件,或手动从链接列表中移除Qt4的库文件。

4. 显式指定Qt5的CMake配置路径(可选)

若服务器同时安装Qt4和Qt5,直接指定Qt5的CMake配置目录,确保CMake优先找到Qt5:

set(Qt5_DIR /usr/lib64/cmake/Qt5) # 路径根据实际Qt5安装位置调整
find_package(Qt5 COMPONENTS Widgets REQUIRED)

5. 优化CMakeLists的其他细节

  • 将最低CMake版本提升至3.1+,对Qt5的支持更完善:
cmake_minimum_required(VERSION 3.1)
  • 替换老旧的C++标准设置方式:
# 移除 add_definitions(-std=c++11)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
修改后的完整CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
project(ProtonBeamSimulation)

# 强制Geant4使用Qt5可视化
set(GEANT4_USE_QT5 ON CACHE BOOL "Use Qt5 for Geant4 visualization")
find_package(Geant4 REQUIRED)

# Include directories
include_directories(${PROJECT_SOURCE_DIR}/src)
include_directories(${Geant4_INCLUDE_DIRS})
include_directories(${ROOT_INCLUDE_DIR})

# Compile options
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Locate sources and headers
file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc)
file(GLOB headers ${PROJECT_SOURCE_DIR}/src/*.hh)

# Add executable
add_executable(proton_beam proton_beam.cc ${sources} ${headers})

# Link Geant4 libraries
target_link_libraries(proton_beam ${Geant4_LIBRARIES})

# Link ROOT libraries
find_library(ROOT_CORE_LIBRARY Core HINTS ${ROOT_LIBRARY_DIR})
find_library(ROOT_HIST_LIBRARY Hist HINTS ${ROOT_LIBRARY_DIR})
find_library(ROOT_RIO_LIBRARY RIO HINTS ${ROOT_LIBRARY_DIR})
target_link_libraries(proton_beam ${ROOT_CORE_LIBRARY} ${ROOT_HIST_LIBRARY} ${ROOT_RIO_LIBRARY})

# Link Qt5 Widgets
set(Qt5_DIR /usr/lib64/cmake/Qt5) # 根据实际情况调整,可注释
find_package(Qt5 COMPONENTS Widgets REQUIRED)
target_link_libraries(proton_beam Qt5::Widgets)

# Executable output path
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR})

# Copy macro files
configure_file(init_vis.mac ${PROJECT_BINARY_DIR}/init_vis.mac COPYONLY)
configure_file(run.mac ${PROJECT_BINARY_DIR}/run.mac COPYONLY)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:40:24