CMake链接spdlog静态库时配置文件查找报错如何解决
问题解决步骤
错误原因分析
你遇到的两次报错都是spdlog的CMake配置文件路径匹配问题:
- 第一次报错是因为CMake默认搜索路径中没有包含你自定义的spdlog安装路径,找不到
spdlogConfig.cmake配置文件 - 第二次报错是因为你把
spdlog_DIR指向了spdlog的源码根目录,这个目录下只有编译生成的临时配置,缺少完整安装后才会生成的spdlogConfigTargets.cmake目标文件
修复步骤
步骤1:确认spdlog编译安装正确
编译spdlog时必须执行安装步骤,不能只完成源码编译:
- 进入spdlog的build目录,执行以下编译安装命令:
cmake .. -DSPDLOG_BUILD_STATIC=ON -DCMAKE_INSTALL_PREFIX=/home/yaodav/Desktop/dnr_main_repo/lib/external make -j$(nproc) make install
- 安装完成后确认以下路径存在配置文件:
/home/yaodav/Desktop/dnr_main_repo/lib/external/lib/cmake/spdlog/spdlogConfig.cmake和spdlogConfigTargets.cmake
步骤2:修改CMakeLists.txt配置
不需要修改原有的find_package逻辑,只需要在find_package(spdlog REQUIRED)之前添加CMAKE前缀路径即可:
# 新增这一行,指定自定义安装的库搜索前缀 set(CMAKE_PREFIX_PATH "/home/yaodav/Desktop/dnr_main_repo/lib/external" ${CMAKE_PREFIX_PATH}) if(NOT TARGET spdlog) find_package(spdlog REQUIRED) endif()
如果要手动指定spdlog_DIR,需要指向配置文件所在的完整路径:
set(spdlog_DIR "/home/yaodav/Desktop/dnr_main_repo/lib/external/lib/cmake/spdlog")
备用方案(不使用config包)
如果不想调整安装配置,也可以手动指定头文件和库路径:
# 指定spdlog头文件路径 include_directories(/home/yaodav/Desktop/dnr_main_repo/lib/external/include) # 查找spdlog静态库 find_library(SPDLOG_STATIC_LIB NAMES spdlog PATHS /home/yaodav/Desktop/dnr_main_repo/lib/external/lib REQUIRED) # 链接时替换spdlog::spdlog为${SPDLOG_STATIC_LIB} target_link_libraries(test_1 PRIVATE ${CONNECTION} ${Boost_LIBRARIES} Threads::Threads pq ${SPDLOG_STATIC_LIB})
内容的提问来源于stack exchange,提问作者yaodav
相关产品推荐
相关产品推荐

