使用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})
关键修正点说明
- 明确指定ROOT组件:在
find_package里直接写需要的组件(Gui和Core),原配置里的${ROOT_LIBRARIES}在find_package执行前是空变量,毫无意义。 - 移除错误的全局库扫描:删掉
file(GLOB_RECURSE SOURCES2 . $ENV{ROOTSYS}/lib/*.so)和target_link_libraries里的${SOURCES2},这行代码会把ROOT lib目录下所有无关的共享库(包括不属于ROOT的系统模块)都加入链接,这正是大量找不到库错误的来源。 - 简化编译标志:只保留
${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




