CMake配置阶段构建fmt与spdlog时链接系统库异常问题咨询
问题:CMake配置阶段构建fmt和spdlog时,spdlog错误链接系统fmt库
问题背景
近几日尝试在CMake配置阶段构建fmt库(10.1.1版本)以及依赖外部fmt的spdlog库(1.12.0版本),编写了相关CMake脚本,但遇到spdlog链接系统libfmt.so.9的问题,仅当将spdlog添加为主程序依赖后重新构建,才能正确链接本地编译的libfmt.so.10,寻求解决方法。
相关CMake脚本及代码
BuildFmt.cmake
FetchContent_Declare( fmt OVERRIDE_FIND_PACKAGE URL "file://${PROJECT_SOURCE_DIR}/deps/fmt-10.1.1.tar.gz" ) FetchContent_GetProperties(fmt) if(NOT fmt_POPULATED) FetchContent_Populate(fmt) endif() execute_process(OUTPUT_QUIET COMMAND cmake -DBUILD_SHARED_LIBS=ON -DFMT_TEST=OFF ${fmt_SOURCE_DIR} WORKING_DIRECTORY "${fmt_BINARY_DIR}" RESULT_VARIABLE FMT_RESULT) execute_process(OUTPUT_QUIET COMMAND make WORKING_DIRECTORY "${fmt_BINARY_DIR}" RESULT_VARIABLE FMT_RESULT) set(FMT_BUILT ON CACHE BOOL "FMT is built" FORCE) list(APPEND CMAKE_PREFIX_PATH "${fmt_BINARY_DIR}")
BuildSpdLog.cmake
FetchContent_Declare( spdlog OVERRIDE_FIND_PACKAGE URL "file://${PROJECT_SOURCE_DIR}/deps/spdlog-1.12.0.tar.gz" ) FetchContent_GetProperties(spdlog) if(NOT spdlog_POPULATED) FetchContent_Populate(spdlog) endif() execute_process( COMMAND cmake -DSPDLOG_BUILD_SHARED=ON -DSPDLOG_BUILD_PIC=ON -DSPDLOG_BUILD_EXAMPLE=OFF -DSPDLOG_FMT_EXTERNAL=ON ${spdlog_SOURCE_DIR} WORKING_DIRECTORY "${spdlog_BINARY_DIR}" RESULT_VARIABLE SPDLOG_RESULT) execute_process( COMMAND make WORKING_DIRECTORY "${spdlog_BINARY_DIR}" RESULT_VARIABLE SPDLOG_RESULT) set(SPDLOG_BUILT ON CACHE BOOL "SPDLOG is built" FORCE) list(APPEND CMAKE_PREFIX_PATH "${spdlog_BINARY_DIR}") add_subdirectory(${spdlog_SOURCE_DIR} ${spdlog_BINARY_DIR})
CMakeLists.txt
cmake_minimum_required(VERSION 3.14.7) project("test") add_compile_definitions(SPDLOG_FMT_EXTERNAL) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) include(BuildFmt) include(BuildSpdLog) find_package(fmt REQUIRED CONFIG) add_executable(my_importer main.cpp) target_link_libraries(my_importer fmt::fmt)
main.cpp
#include<fmt/format.h> int main() { return 0; }
问题现象
- 初始构建无报错,但用
ldd命令查看spdlog库时,发现其链接了系统中的libfmt.so.9:
nikola@notebook ~/projects/2m/cmake_test/build $ ldd ./_deps/spdlog-build/libspdlog.so linux-vdso.so.1 (0x00007fff1a948000) libfmt.so.9 => /usr/lib64/libfmt.so.9 (0x00007f94489e2000) libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/13/libstdc++.so.6 (0x00007f9448782000) libm.so.6 => /lib64/libm.so.6 (0x00007f94486a2000) libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/13/libgcc_s.so.1 (0x00007f944867e000) libc.so.6 => /lib64/libc.so.6 (0x00007f94484ab000) /lib64/ld-linux-x86-64.so.2 (0x00007f9448ab7000)
- 将spdlog添加为主程序依赖(修改
target_link_libraries为target_link_libraries(my_importer fmt::fmt spdlog::spdlog))后,执行make时spdlog会重新构建,此时能正确链接本地编译的libfmt.so.10:
nikola@notebook ~/projects/cmake_test/build $ make [ 11%] Building CXX object _deps/spdlog-build/CMakeFiles/spdlog.dir/src/spdlog.cpp.o [ 22%] Building CXX object _deps/spdlog-build/CMakeFiles/spdlog.dir/src/stdout_sinks.cpp.o [ 33%] Building CXX object _deps/spdlog-build/CMakeFiles/spdlog.dir/src/color_sinks.cpp.o [ 44%] Building CXX object _deps/spdlog-build/CMakeFiles/spdlog.dir/src/file_sinks.cpp.o [ 55%] Building CXX object _deps/spdlog-build/CMakeFiles/spdlog.dir/src/async.cpp.o [ 66%] Building CXX object _deps/spdlog-build/CMakeFiles/spdlog.dir/src/cfg.cpp.o [ 77%] Linking CXX shared library libspdlog.so [ 77%] Built target spdlog [ 88%] Building CXX object CMakeFiles/2m_importer.dir/main.cpp.o [100%] Linking CXX executable 2m_importer [100%] Built target 2m_importer nikola@notebook ~/projects/2m/cmake_test/build $ ldd ./_deps/spdlog-build/libspdlog.so linux-vdso.so.1 (0x00007fffe279d000) libfmt.so.10 => /home/nikola/projects/2m/cmake_test/build/_deps/fmt-build/libfmt.so.10 (0x00007f882ee5c000) libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/13/libstdc++.so.6 (0x00007f882ebd7000) libm.so.6 => /lib64/libm.so.6 (0x00007f882eaf7000) libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/13/libgcc_s.so.1 (0x00007f882ead3000) libc.so.6 => /lib64/libc.so.6 (0x00007f882e900000) /lib64/ld-linux-x86-64.so.2 (0x00007f882eef3000)
求助说明
CMake基础薄弱,尝试过ExternalProject但未解决问题,希望找到原因并修正配置,让spdlog在初始构建阶段就能正确链接本地编译的fmt库。
内容的提问来源于stack exchange,提问作者nikoladsp
相关产品推荐
相关产品推荐

