将问题与yaml-cpp联系起来



我正在尝试将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"方法。品牌-VERBOSE=1的建筑(由@Tsyvarev建议(给出:

[100%]链接CXX可执行时刻ppcd/home/gvbarroso/Devel/momentsp/build/src&amp//usr/bin/cmake-E cmake_link_script CMakeFiles/momentsp.dir/link.txt--verbose=1/usr/bin/c++-std=c++20-Wffc++-Wshadow-Wall-Wextra-fast math-O3-march=native CMakeFiles/momentspp.dir/Log.cpp.o CMakeFiles/Momentsppp.dir/SpolymorphicData.cpp.o CMakeFiles/momentpp.dir/SumStatsLibrary.cpp.oCMakeFiles/moments pp.dir/Difift.cpp.o CMakeFiles/momentspp.dir/Migration.cpp.oM重组.cpp.oCMakeFiles/momentsp.dir/Epoch.cpp.o CMakeFiles/Memontsp.dir/Model.cpp。o CMakeFiles/memontsp.der/OptimizationWrapper.cpp.o CMakeFiles/memontpp.dir/Demes.cpp,/home/gfbarroso/.local/lib:/home/gwbarroso/.local/lib/libpp-phyl3.so.1.0.0/usr/lib/x86_64-linux-gnu/librast_iostreams.so.1.74.0/home/gfbarros/.local/lib/libpp-seq3.so.0.0/home/gfbaroso/.local-lib/libbpp-core3.so.0.0/usr/bin/ld:CMakeFiles/momentspp.dir/Demes.cpp.o:函数Demes::parse(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': Demes.cpp:(.text+0x4c): undefined reference toYAML::LoadFile(std::__cxx11::basic_string<char,std::char_traits,std::分配器>const&('//usr/bin/ld:Demes.cpp:(.text+0x12c(:对`YAML::operator<的未定义引用<(std::ostream&,YAML::Node const&('collect2:错误:ld返回1退出状态make[2]:***[src/CMakeFiles/momentsp.dir/build.make:277:src/momentpp]错误1make[2]:正在离开目录'/home/gvbarroso/Devel/momentsp/build'make[1]:***[CMakeFiles/Makefile2:125:src/CMakeFiles/momentsp.dir/all]错误2make[1]:正在离开目录'/home/gvbarroso/Devel/momentsp/build'make:***[Makefile:156:all]错误2

我正在使用CMake来构建我的项目,但我仍然对它相当陌生

EDIT:我忘了提到我有两个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构建项目的人(。

谢谢,Gustavo

添加以下预处理器定义,其中包含yamp-cpp。

#define YAML_CPP_STATIC_DEFINE

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

最新更新