c++yamlundefined-referenceyaml-cpp

Compiler error with yaml-cpp - undefined reference to `YAML::detail::node_data::convert_to_map`


Here's the complete log:

/tmp/ccCvErNZ.o: In function `YAML::detail::node& YAML::detail::node_data::get<std::string>(std::string const&, std::shared_ptr<YAML::detail::memory_holder>)':
cricket.cpp:(.text._ZN4YAML6detail9node_data3getISsEERNS0_4nodeERKT_St10shared_ptrINS0_13memory_holderEE[_ZN4YAML6detail9node_data3getISsEERNS0_4nodeERKT_St10shared_ptrINS0_13memory_holderEE]+0x94): undefined reference to `YAML::detail::node_data::convert_to_map(std::shared_ptr<YAML::detail::memory_holder>)'
collect2: error: ld returned 1 exit status

The code I'm trying to compile is simple

#include <iostream>
#include <yaml-cpp/yaml.h>

using namespace std;

int main() {
    YAML::Node test = YAML::LoadFile("test.yaml");
    if (test["date"]) {
      cout << "HELLO";
    }

    return 0;
}

The YAML I'm using is the example from http://www.yaml.org/start.html

If I just try to load the YAML, it loads fine. But if I try to access any data I get the same error. So it's not a linking problem.

EDIT: I can do things like cout << test and cout << test.type() and other functions. I think the problem is in using a string based map for accessing internal nodes.


Solution

  • It seems that you are not properly linking the yaml-cpp library. Add the argument -lyaml-cpp when compiling. For example:

    g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o test main.cpp
    

    EDIT

    Another option is to include this cmake to your CMakeLists.txt:

    # attempt to find static library first if this is set
    if(YAMLCPP_STATIC_LIBRARY)
        set(YAMLCPP_STATIC libyaml-cpp.a)
    endif()
    
    # find the yaml-cpp include directory
    find_path(YAMLCPP_INCLUDE_DIR yaml-cpp/yaml.h
              PATH_SUFFIXES include
              PATHS
              ~/Library/Frameworks/yaml-cpp/include/
              /Library/Frameworks/yaml-cpp/include/
              /usr/local/include/
              /usr/include/
              /sw/yaml-cpp/         # Fink
              /opt/local/yaml-cpp/  # DarwinPorts
              /opt/csw/yaml-cpp/    # Blastwave
              /opt/yaml-cpp/
              ${YAMLCPP_DIR}/include/)
    
    # find the yaml-cpp library
    find_library(YAMLCPP_LIBRARY
                 NAMES ${YAMLCPP_STATIC} yaml-cpp
                 PATH_SUFFIXES lib64 lib
                 PATHS ~/Library/Frameworks
                        /Library/Frameworks
                        /usr/local
                        /usr
                        /sw
                        /opt/local
                        /opt/csw
                        /opt
                        ${YAMLCPP_DIR}/lib)
    
    # handle the QUIETLY and REQUIRED arguments and set YAMLCPP_FOUND to TRUE if all listed variables are TRUE
    include(FindPackageHandleStandardArgs)
    FIND_PACKAGE_HANDLE_STANDARD_ARGS(YAMLCPP DEFAULT_MSG YAMLCPP_INCLUDE_DIR YAMLCPP_LIBRARY)
    mark_as_advanced(YAMLCPP_INCLUDE_DIR YAMLCPP_LIBRARY)