You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用ROOT库构建C++ GUI程序遭遇链接器(ld)错误求助

解决ROOT GUI程序链接错误的问题

你的链接错误根源在于CMake配置中错误地尝试链接ROOT lib目录下的所有共享库,而那些找不到的lmodule-*库是GNOME/Evolution相关的模块,完全不是你的ROOT GUI程序需要的依赖。

修正后的CMakeLists.txt

把你的CMakeLists.txt替换成下面的版本,去掉错误的全局库引入逻辑:

cmake_minimum_required(VERSION 3.15)
project(gui)

set(CMAKE_CXX_STANDARD 17)

# 针对Snap安装的ROOT设置查找路径
set(CMAKE_FIND_ROOT_PATH /snap/root-framework/current/usr/local)
find_package(ROOT REQUIRED COMPONENTS Gui Core)  # 明确指定需要的ROOT核心与GUI组件

include_directories(${ROOT_INCLUDE_DIRS})
include(${ROOT_USE_FILE})

add_executable(gui main.cpp)

# 只链接ROOT提供的正确依赖库
target_link_libraries(gui PUBLIC ${ROOT_LIBRARIES})
set_target_properties(gui PROPERTIES COMPILE_FLAGS ${ROOT_CXX_FLAGS})

关键修正点说明

  1. 明确指定ROOT组件:在find_package里直接写需要的组件(GuiCore),原配置里的${ROOT_LIBRARIES}find_package执行前是空变量,毫无意义。
  2. 移除错误的全局库扫描:删掉file(GLOB_RECURSE SOURCES2 . $ENV{ROOTSYS}/lib/*.so)target_link_libraries里的${SOURCES2},这行代码会把ROOT lib目录下所有无关的共享库(包括不属于ROOT的系统模块)都加入链接,这正是大量找不到库错误的来源。
  3. 简化编译标志:只保留${ROOT_CXX_FLAGS}即可,${ROOT_CC_FLAGS}是给C编译器用的,你的程序是C++项目,不需要它。

额外验证步骤

如果修正后还是有问题,可以先手动用ROOT的工具链编译测试,确认代码本身没问题:

rootcling -f main_dict.cpp -c main.cpp
g++ -o gui main.cpp main_dict.cpp `root-config --cflags --libs Gui`

如果这个命令能成功生成可执行文件,说明你的代码逻辑没问题,问题完全出在CMake配置上。

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

火山引擎 最新活动