Gcc 对YAML::LoadFile的未定义引用

Gcc 对YAML::LoadFile的未定义引用,gcc,yaml-cpp,Gcc,Yaml Cpp,我正在尝试使用新版本的libyaml cpp,但链接器出现问题(未定义对'YAML::LoadFile(std::basic_string const&')的引用。) 我按如下方式构建库: cmake -DBUILD_SHARED_LIBS=ON .. make sudo make install 然后我包括yaml-cpp/yaml.h并调用yaml::LoadFile(一些字符串)。我的汇编行是: g++ -L/usr/local/lib -I/usr/local/include -lya

我正在尝试使用新版本的libyaml cpp,但链接器出现问题(
未定义对'YAML::LoadFile(std::basic_string const&')的引用。

我按如下方式构建库:

cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install
然后我包括
yaml-cpp/yaml.h
并调用
yaml::LoadFile(一些字符串)。我的汇编行是:

g++ -L/usr/local/lib -I/usr/local/include -lyaml-cpp -std=c++0x -o $@  $^

我试着把确切的
。所以
文件也放在那里,但运气不好。使用
nm
我可以在共享库中看到
LoadFile
函数。我现在无法确定我是否使用了错误的生成行,或者库有问题。

您是否也安装了旧版本的库?GCC可能首先寻找这个版本,而不考虑新版本。

< P>这是命令行上的排序问题。我想我永远不会理解GCC命令行逻辑。简单地将库放在末尾似乎是可行的:

g++ -L/usr/local/lib -I/usr/local/include -std=c++0x -o $@  $^ -lyaml-cpp

今天整个晚上我都在为这件事苦苦挣扎。由于我在互联网上的任何地方都找不到有用的信息,我将结果发布在这里:

将OSX El Capitan与新版本的XCode(7.3)和CLang(Apple LLVM版本7.3.0(CLang-703.0.29)结合使用 使用yaml cpp 0.5.3

我所做的事情使它工作:

  • 从获取FindYamlCpp.cmake。将其保存在/usr/local/share/cmake/Modules中
  • 设置cmakfiles.txt以查找Yaml cpp

    # YAML with yaml-cpp
    SET(YAMLCPP_STATIC_LIBRARY TRUE)
    FIND_PACKAGE(YamlCpp)
    IF(YamlCpp_FOUND)
        MESSAGE("yaml-cpp Library FOUND: yaml-cpp related sources will be built.")
    ELSEIF(YamlCpp_FOUND)
        MESSAGE("yaml-cpp Library NOT FOUND!")
    ENDIF(YamlCpp_FOUND)
    
  • 将代码添加到src/cmakfiles.txt以使用FindYamlCpp

        # Enable Yaml 
        IF(YAMLCPP_FOUND)
            ADD_EXECUTABLE(my_exec my_source.cpp)
        ENDIF(YAMLCPP_FOUND)
    
  • 例如,使用ccmake:

  • 将CMAKE\u模块路径设置为/usr/local/share/CMAKE/Modules
  • 将CMAKE_EXEC_LINKER_标志设置为-lyaml cpp

  • 支持新的yaml cpp API

    find_package(PkgConfig)
    pkg_check_modules(YAMLCPP REQUIRED yaml-cpp>=0.5)
    include_directories(${YAMLCPP_INCLUDE_DIRS})
    
    add_executable(name src/name.cpp)
    target_link_libraries(name ${catkin_LIBRARIES}  ${YAMLCPP_LIBRARIES})
    

    我通过调整我的
    CMakeList.txt

    我没有遇到上述问题:

    g++-L/usr/local/lib-I/usr/local/include-std=c++0x main.cpp-lyaml cpp
    
    但是使用cmake和通过CLion构建对我来说失败了

    这个
    CMakeList.txt
    为我修复了它(这只是一个最小的精简版本,但它应该给出一个想法)。它假设您的系统上只安装了一个yaml cpp版本:

    # Projekt Description / etc
    cmake_minimum_required(VERSION 3.14)
    project(yaml_cpp)
    set(CMAKE_CXX_STANDARD 14)
    
    # Declaration of package required
    find_package(PkgConfig)
    pkg_check_modules(YAMLCPP REQUIRED yaml-cpp>=0.5)
    
    # Define the executable and link the yaml libs
    add_executable(yaml_cpp main.cpp)
    target_link_libraries(yaml_cpp ${YAMLCPP_LIBRARIES})
    

    这是最简单的工作方式。我从上面得到了灵感。

    是的,我也有旧的,但无法移除(其他一些东西需要它)。这就是为什么我认为放置一个显式路径和/或库名会首先加载新的路径和/或库名。它确实找到了。如果我放置
    -l:libyaml cpp.so.0.5
    is,它不会抱怨缺少文件,但仍然找不到引用。您能解释一下这些步骤的功能/目标是什么,以便人们更容易地使用它吗受得了吗?