cmake 与yaml-cpp的链接问题

az31mfrm  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(338)

我正在尝试将yaml-cpp合并到我的项目中。我有一个“Demes”类,我需要在其中解析一个YAML文件。
这是Demes.cpp中的相关方法:

#include "Demes.hpp"

void Demes::parse(const std::string& fileName)
{
    YAML::Node test = YAML::LoadFile(fileName);
}

其中Demes.hpp包含yaml-cpp头文件并声明了'parse'方法。使用make -VERBOSE=1(如@Tsyvarev所建议的)进行构建得到:
[100%]正在链接CXX可执行文件瞬间spp cd /home/gvbarroso/Devel/瞬间spp/build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/瞬间spp.dir/link.txt--详细信息=1 /usr/bin/c++ -std=c20 -Weffc -Wshadow -Wall -Wextra -ffast-math -O3 -march=本机CMakeFiles/瞬间spp.dir/Log.cpp. o CMakeFiles/瞬间spp.dir/多态性数据.cpp. o CMakeFiles/瞬间spp.dir/SumStatsLibrary.cpp.o CMakeFiles/瞬时物种目录/漂移.cpp.o CMakeFiles/瞬时物种目录/迁移.cpp.o CMakeFiles/瞬时物种目录/突变.cpp.o CMakeFiles/瞬时物种目录/重组.cpp.o CMakeFiles/瞬时物种目录/时期.cpp. o CMakeFiles/瞬时物种目录/模型.cpp. o CMakeFiles/瞬时物种目录/优化 Package . cpp. o CMakeFiles/瞬时物种目录/Demes.cpp. o CMakeFiles/瞬时物种目录/主.cpp.o -o瞬时物种-Wl,-rpath,/home/gvbarroso/.local/lib:/home/gvbarroso/.local/库/libbpp-phyl 3.so.1.0.0 /用户名/库/x86_64-Linux-gnu/libboost_iostreams. so. 1. 74. 0/home/gvbarroso/.local/库/libbpp-seq 3.so.1.0.0 /home/gvbarroso/.local/库/libbpp-core 3.so.1.0.0 /用户名/库/ld:CMakeFiles/力矩相关目录/Demes.cpp.o:在函数Demes::parse(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': Demes.cpp:(.text+0x4c): undefined reference to YAML::LoadFile(标准::__cxx11::基本字符串〈字符,标准::字符特性,标准::分配器〉常量&)' /usr/bin/ld:数据cpp:(.text+0x 12 c):未定义对“YAML::运算符〈〈(标准::ostream&,YAML::节点常量&)”集合2的引用:错误:ld返回了1个退出状态make[2]:***[源代码/CMakeFiles/瞬时配置文件目录/内部版本号:277:src/momentspp]错误1生成[2]:正在离开目录“/home/gvbarroso/Devel/momentspp/build”make[1]:***[C生成文件/生成文件2:125:src/CMakeFiles/瞬间配置文件目录/all]错误2生成[1]:正在离开目录“/home/gvbarroso/Devel/momentspp/build”创建:***[生成文件:156:全部]错误2
我正在使用CMake构建我的项目,但我对它仍然相当不熟悉。

编辑:我忘了提到我有两个CMakeLists.txt文件,一个在src中,另一个在外部构建中。

我的CMakeLists.txt文件在外部构建中的开头是:

cmake_minimum_required (VERSION 3.5.0)
project (momentspp CXX)

SET(CMAKE_CXX_FLAGS "-std=c++20 -Weffc++ -Wshadow -Wall -Wextra -ffast-math -O3 -march=native")

其中我寻找yaml-cpp的部分是:

FIND_PACKAGE(yaml-cpp REQUIRED)
IF(yaml-cpp_FOUND)
    INCLUDE_DIRECTORIES(${yaml-cpp_INCLUDE_DIRS})
    SET(LIBS {yaml-cpp_LIBRARIES})
    MESSAGE("-- yaml-cpp libraries found here:")
    MESSAGE(" includes: ${yaml-cpp_INCLUDE_DIRS}")
ENDIF()

src中的完整CMakeLists.txt文件是:

SET(momentspp_CPP
  Log.cpp
  PolymorphismData.cpp
  SumStatsLibrary.cpp
  Drift.cpp
  Migration.cpp
  Mutation.cpp
  Recombination.cpp
  Epoch.cpp
  Model.cpp
  OptimizationWrapper.cpp
  Demes.cpp
  main.cpp
)

ADD_EXECUTABLE (momentspp ${momentspp_CPP})

SET(momentspp-targets momentspp)

FOREACH (target ${momentspp-targets})
    TARGET_LINK_LIBRARIES(${target} ${BPP_LIBS_SHARED} ${BOOST_LIBS_SHARED} ${EIGEN3_LIBS_SHARED} ${yaml-cpp_LIBS_SHARED})
   TARGET_LINK_LIBRARIES (${target} ${LIBS})
ENDFOREACH (target)

INSTALL(TARGETS ${momentspp-targets} DESTINATION ${CMAKE_INSTALL_BINDIR})

这在包括YAML-CPP之前是有效的。
这感觉像是一个相当复杂的CMake设置,但我是从以前的项目中复制和编辑的,在那里有人帮助我完成了它。
我如何解决链接问题?我试着在这里寻找类似的问题,但无法得到他们的解决方案为我工作(显然是那些不使用CMake来构建他们的项目的人)。
谢谢你古斯塔沃

jq6vz3qz

jq6vz3qz1#

在包含yamp-cpp的地方添加以下预处理器定义。

#define YAML_CPP_STATIC_DEFINE

我遇到了类似的问题,并从here找到了最初的答案。这似乎是Windows的一个特定问题。至少从我自己的经验来看,构建在Linux和macOS上顺利通过。在GitHub上也提出了一个可能的补救措施,并标记为已解决。然而,似乎同样的问题仍然存在于Windows上。

相关问题