Github Action下Conan管理的C++项目链接fmt库报错找不到-lfmt
排查解决步骤
1. 检查CMakeLists.txt链接配置
这是概率最高的问题原因,你需要确认CMake中对目标的链接配置符合Conan生成规则:
- 优先使用Conan通过
cmake_find_package生成的导入目标进行链接,不要直接使用裸库名:
# 正确写法 target_link_libraries(genetic_algo PRIVATE fmt::fmt effolkronium_random::effolkronium_random range-v3::range-v3) # 错误写法,会导致仅传递-lfmt,不传递库搜索路径 target_link_libraries(genetic_algo PRIVATE fmt effolkronium_random range-v3)
- 如果你使用Conan生成的全局依赖变量
CONAN_LIBS,确认已经将其添加到目标的链接库中:
target_link_libraries(genetic_algo PRIVATE ${CONAN_LIBS})
2. 修正Github Action中的Conan配置
本地环境的Conan已经配置了和编译环境匹配的参数,但线上Runner的默认Conan配置与你使用的GCC 11不匹配,需要在安装Conan后、CMake配置前添加Conan profile配置步骤:
- name: 配置Conan编译参数 run: | conan profile new default --detect --force conan profile update settings.compiler=gcc default conan profile update settings.compiler.version=11 default conan profile update settings.compiler.cppstd=${{matrix.config.cxx_standard}} default conan profile update settings.compiler.libcxx=libstdc++11 default
3. 修复Conan缓存规则
你当前的缓存key没有包含编译器版本、C++标准、conanfile.py的哈希,旧缓存中存储的低版本GCC生成的依赖包会和当前构建环境冲突,修改缓存配置如下:
- name: Cache uses: actions/cache@v2 env: cache-name: cache-conan-modules with: path: | ${{ env.CONAN_USER_HOME }} ~/.cache/pip key: ${{ runner.os }}-${{ env.BUILD_TYPE }}-${{ matrix.config.cc }}-${{ hashFiles('conanfile.py') }}-${{ hashFiles('CMakeLists.txt') }}-${{ hashFiles('cmake/Conan.cmake') }}
修改完成后可以先临时注释掉缓存配置跑一次流水线,确认是否是缓存导致的问题。
4. 打印详细日志定位问题
如果以上步骤都没有解决问题,添加日志打印确认链接参数:
- 在
CMakeLists.txt中添加以下代码,打印fmt库的链接路径配置:
find_package(fmt REQUIRED) get_target_property(FMT_LINK_DIR fmt::fmt INTERFACE_LINK_DIRECTORIES) message(STATUS "Fmt库的链接搜索路径:${FMT_LINK_DIR}")
- 构建时添加verbose参数,输出完整的链接命令:
- name: Build run: | CC=${{matrix.config.cc}} CXX=${{matrix.config.cxx}} cmake --build ./build --config ${{ env.BUILD_TYPE }} --verbose
如果输出的链接命令中没有包含fmt库的存储路径,说明CMake的链接配置没有正确传递参数,回到第一步重新检查链接目标的配置。
内容的提问来源于stack exchange,提问作者Ulrich Von Rekkenin
相关产品推荐
相关产品推荐

