未定义对 YAML::LoadFile 的引用

Posted

技术标签:

【中文标题】未定义对 YAML::LoadFile 的引用【英文标题】:undefined reference to 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 函数。我现在不知道是我以某种方式使用了错误的构建线还是库有问题。

【问题讨论】:

【参考方案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

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

    从internet 获取 FindYamlCpp.cmake。将其保存在 /usr/local/share/cmake/Modules 中

    设置 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)
    

    将代码添加到 src/CmakeFiles.txt 以使用 FindYamlCpp

        # Enable Yaml 
        IF(YAMLCPP_FOUND)
            ADD_EXECUTABLE(my_exec my_source.cpp)
        ENDIF(YAMLCPP_FOUND)
    

    例如使用 ccmake:

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

【讨论】:

以上是关于未定义对 YAML::LoadFile 的引用的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的引用错误,未定义通知

Firefox 4 中的 JQuery 未定义和 $ 未定义错误 [关闭]

C++ 引用不一致

具有未定义和空值的排序对象数组

检查jQuery中的未定义和空值

未定义行为与求值顺序