Ubuntu20.04下CMake构建dpgo时SuiteSparse库链接错误求助
解决DPGO项目CMake优先链接Covins依赖中SuiteSparse的问题
核心问题分析
Covins工作空间的devel目录被加入到CMake默认搜索路径,导致find_package优先识别该路径下的SuiteSparse静态库;而系统安装的libsuitesparse-dev包内的静态库未编译-fPIC参数,无法链接到DPGO的共享库中,因此必须强制CMake使用系统提供的SuiteSparse共享库。
解决方案步骤
1. 彻底排除Covins工作空间的干扰
在DPGO的CMakeLists.txt最开头添加代码,直接过滤掉Covins的路径,避免CMake搜索该目录下的依赖:
# 过滤covins_ws的devel路径,防止干扰依赖搜索 list(FILTER CMAKE_PREFIX_PATH EXCLUDE REGEX "/home/glenn/ws/covins_ws/devel")
2. 强制CMake优先搜索共享库
在查找SuiteSparse组件前,设置CMake优先查找.so共享库(避免误选未适配的静态库):
# 优先查找共享库,规避未编译-fPIC的静态库链接问题 set(CMAKE_FIND_LIBRARY_SUFFIXES .so .a)
3. 指定SuiteSparse系统路径并查找组件
替换原有的SuiteSparse查找逻辑,明确指定系统安装路径:
# 指定SuiteSparse根目录为系统默认路径 set(SuiteSparse_ROOT "/usr") # 查找所需的SuiteSparse组件 find_package(CHOLMOD REQUIRED) find_package(SPQR REQUIRED)
4. 清理缓存并重新构建
删除DPGO的build目录,清空旧缓存后重新执行构建:
rm -rf build && mkdir build && cd build cmake .. make -j$(nproc)
备选方案:手动指定库和头文件
如果上述方法仍不生效,可跳过find_package流程,直接手动指定系统的SuiteSparse资源:
# 添加系统SuiteSparse头文件路径 include_directories("/usr/include/suitesparse") # 链接DPGO目标时,手动添加系统共享库 target_link_libraries(DPGO PRIVATE /usr/lib/x86_64-linux-gnu/libcholmod.so /usr/lib/x86_64-linux-gnu/libspqr.so /usr/lib/x86_64-linux-gnu/libsuitesparseconfig.so /usr/lib/x86_64-linux-gnu/libamd.so /usr/lib/x86_64-linux-gnu/libcolamd.so /usr/lib/x86_64-linux-gnu/libcamd.so /usr/lib/x86_64-linux-gnu/libccolamd.so /usr/lib/x86_64-linux-gnu/libmetis.so )
通过以上配置,可确保DPGO完全使用系统安装的SuiteSparse依赖,同时保留Covins工作空间不受影响。
内容的提问来源于stack exchange,提问作者User_0603
相关产品推荐
相关产品推荐

