无法在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
相关产品推荐
相关产品推荐

