如何让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
相关产品推荐
相关产品推荐

