You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在CMake项目中链接yaml-cpp,请求排查配置问题

无法链接yaml-cpp的CMake项目问题排查与解决

问题现象

CMake项目编译时出现yaml-cpp相关的未定义引用错误,已安装多个版本的yaml-cpp(7.0、6.3、5.3),手动添加-lyaml-cpp编译参数无效,CMakeCache.txt显示yaml-cpp的配置路径正确。

项目CMakeLists.txt配置

cmake_minimum_required(VERSION 3.0 FATAL_ERROR) 
project(test_includes)

#find_package(Boost COMPONENTS system filesystem REQUIRED)
#include_directories( ${Boost_INCLUDE_DIRS} )

set(Torch_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libtorch/share/cmake/Torch")

find_package(Boost COMPONENTS system filesystem REQUIRED)
find_package(Threads REQUIRED)
find_package(Torch REQUIRED)
find_package(yaml-cpp REQUIRED)

include_directories( ${Boost_INCLUDE_DIRS}
  ${EIGEN3_INCLUDE_DIR}
  ${yaml-cpp_INCLUDE_DIR}
  ${Torch_INCLUDE_DIRS}
  include)

set(CMAKE_CXX_FLAGS_DEBUG "-g3")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g3 -gdwarf -fno-omit-frame-pointer -DNDEBUG")
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
add_subdirectory(include)

#link_directories(libraries)

set( LIBS_TO_LINK
                  Domains
                  Agents
                  Planning
                  yaml-cpp
                  ${TORCH_LIBRARIES}
                  ${CMAKE_THREAD_LIBS_INIT})# -llapack)

add_executable(testWarehouse testWarehouse.cpp)
target_link_libraries(testWarehouse ${LIBS_TO_LINK})

编译错误信息

[100%] Linking CXX executable testWarehouse
/usr/bin/ld: CMakeFiles/testWarehouse.dir/testWarehouse.cpp.o: in function `WarehouseSimulation(std::string const&, unsigned long)':
testWarehouse.cpp:(.text+0x13af): undefined reference to `YAML::LoadFile(std::string const&)' 
/usr/bin/ld: CMakeFiles/testWarehouse.dir/testWarehouse.cpp.o: in function `YAML::detail::node_ref::set_scalar(std::string const&)':
testWarehouse.cpp:(.text._ZN4YAML6detail8node_ref10set_scalarERKSs[_ZN4YAML6detail8node_ref10set_scalarERKSs]+0x2a): undefined reference to `YAML::detail::node_data::set_scalar(std::string const&)' 
/usr/bin/ld: CMakeFiles/testWarehouse.dir/testWarehouse.cpp.o: in function `YAML::Node::Scalar() const':
testWarehouse.cpp:(.text._ZNK4YAML4Node6ScalarEv[_ZNK4YAML4Node6ScalarEv]+0x79): undefined reference to `YAML::detail::node_data::empty_scalar()' 
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/testWarehouse.dir/build.make:109: testWarehouse] Error 1
make[1]: *** [CMakeFiles/Makefile2:152: CMakeFiles/testWarehouse.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

排查信息

CMakeCache.txt中yaml-cpp路径配置:

//The directory containing a CMake configuration file for yaml-cpp.
yaml-cpp_DIR:PATH=/usr/share/cmake/yaml-cpp

解决方案

1. 使用yaml-cpp官方CMake目标

yaml-cpp的CMake配置提供了yaml-cpp::yaml-cpp导入目标,替代直接写yaml-cpp,该目标会自动处理库路径和依赖传递,避免链接错误。修改LIBS_TO_LINK中的yaml-cpp为yaml-cpp::yaml-cpp。

2. 替换全局include为目标专属包含目录

避免使用全局include_directories,改用target_include_directories为目标单独设置包含路径,确保依赖正确作用于目标:

target_include_directories(testWarehouse PRIVATE
  ${Boost_INCLUDE_DIRS}
  ${EIGEN3_INCLUDE_DIR}
  ${yaml-cpp_INCLUDE_DIR}
  ${Torch_INCLUDE_DIRS}
  include
)

3. 指定yaml-cpp的CONFIG模式查找

确保find_package正确加载yaml-cpp的配置文件,在find_package时添加CONFIG参数:

find_package(yaml-cpp REQUIRED CONFIG)

4. 验证构建类型匹配

确认yaml-cpp的构建类型(Debug/Release)与当前项目一致。如果系统安装的是Release版本yaml-cpp,而项目以Debug模式编译,可能导致链接不兼容。可通过设置CMAKE_BUILD_TYPE统一构建类型:

set(CMAKE_BUILD_TYPE Release)

修改后的完整CMakeLists.txt示例

cmake_minimum_required(VERSION 3.0 FATAL_ERROR) 
project(test_includes)

set(Torch_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libtorch/share/cmake/Torch")

find_package(Boost COMPONENTS system filesystem REQUIRED)
find_package(Threads REQUIRED)
find_package(Torch REQUIRED)
find_package(yaml-cpp REQUIRED CONFIG)

set(CMAKE_CXX_FLAGS_DEBUG "-g3")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O3 -g3 -gdwarf -fno-omit-frame-pointer -DNDEBUG")
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

add_subdirectory(include)

set(LIBS_TO_LINK
                  Domains
                  Agents
                  Planning
                  yaml-cpp::yaml-cpp
                  ${TORCH_LIBRARIES}
                  ${CMAKE_THREAD_LIBS_INIT})

add_executable(testWarehouse testWarehouse.cpp)

target_include_directories(testWarehouse PRIVATE
  ${Boost_INCLUDE_DIRS}
  ${EIGEN3_INCLUDE_DIR}
  ${yaml-cpp_INCLUDE_DIR}
  ${Torch_INCLUDE_DIRS}
  include
)

target_link_libraries(testWarehouse ${LIBS_TO_LINK})

内容的提问来源于stack exchange,提问作者Kallinteris Andreas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:20:44