【问题标题】:undefined reference to YAML::LoadFile未定义对 YAML::LoadFile 的引用
【发布时间】:2014-03-03 05:16:12
【问题描述】:

我正在尝试使用新版本的 libyaml-cpp 并遇到链接器问题 (undefined reference to 'YAML::LoadFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)')。

我按如下方式构建库:

cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

然后我包含yaml-cpp/yaml.h 并调用YAML::LoadFile( some_string );。我的编译行是:

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

我也尝试将确切的.so 文件放在那里,但没有成功。使用nm 我可以在共享库中看到LoadFile 函数。我现在不知道是我以某种方式使用了错误的构建线还是库有问题。

【问题讨论】:

    标签: gcc yaml-cpp


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      支持新的 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})
      

      【讨论】:

      • 你能解释一下这些步骤的功能/目标是什么,以便人们更容易理解它吗?
      【解决方案3】:

      我通过调整我的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})
      

      这是最简单的工作方式。我受到上述Sinaí Aranda 的启发。

      【讨论】:

        【解决方案4】:

        你也安装了旧版本的库吗?可能 gcc 会先寻找那个版本,而不考虑新版本。

        【讨论】:

        • 是的,我也有旧的,但无法删除它(其他一些东西需要它)。这就是为什么我虽然放置一个明确的路径和/或库名称会首先加载新的。
        • 它确实找到了它。如果我输入 -l:libyaml-cpp.so.0.5 不会抱怨缺少文件,但仍然找不到参考。
        【解决方案5】:

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

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

        我为使它工作所做的事情:

        1. internet 获取 FindYamlCpp.cmake。将其保存在 /usr/local/share/cmake/Modules 中
        2. 设置 CMakeFiles.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)
          
        3. 将代码添加到 src/CmakeFiles.txt 以使用 FindYamlCpp

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

          1. 将 CMAKE_MODULE_PATH 设置为 /usr/local/share/cmake/Modules
          2. 将 CMAKE_EXEC_LINKER_FLAGS 设置为 -lyaml-cpp

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-02-16
          • 1970-01-01
          • 2023-03-05
          • 1970-01-01
          • 2011-03-27
          • 2022-01-22
          • 2016-04-04
          相关资源
          最近更新 更多