yaml-cpp 编译错误:“未定义对 YAML::LoadFile 的引用”

Posted

技术标签:

【中文标题】yaml-cpp 编译错误:“未定义对 YAML::LoadFile 的引用”【英文标题】:yaml-cpp compile error: "undefined reference to YAML::LoadFile" 【发布时间】:2018-05-26 16:47:31 【问题描述】:

我正在尝试使用 yaml-cpp 运行一个简单的测试程序,如下所示:

// main.cpp

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

int main(int argc, const char *argv[])

     YAML::Node config = YAML::LoadFile("config.yaml");
     std::cout << config << std::endl;

我正在尝试使用此命令进行编译:

g++ -lyaml-cpp -L$(HOME)/local/yaml-cpp/build -I$(HOME)/local/yaml-cpp/include -std=c++11 main.cpp

我收到如下所示的错误:

/tmp/ccz0D5ol.o: In function `main':
main.cpp:(.text+0xdd): undefined reference to `YAML::LoadFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: error: ld returned 1 exit status
make: *** [all] Error 1

这是我正在使用的 g++:

$ g++ --version
g++ (GCC) 5.4.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

这是在我没有 root 访问权限的 linux 机器上。我将 git repo 克隆到$HOME/local/yaml-cpp,创建了一个构建目录,运行cmake -DBUILD_SHARED_LIBS=ON ..,然后运行make,创建了文件libyaml-cpp.so.0.6.2 和符号链接libyaml-cpp.so.0.6libyaml-cpp.so。如果重要的话,我的 cmake 版本是 3.11.2。

不确定这是否有帮助,但我首先由 yaml-cpp 的维护者以github issue 运行此问题,他说

可能是配置错误;如果您在 Stack Overflow 上提问,您可能会得到答案。

我还发现了一个几乎完全相同的问题,但她 solution 重新排列编译命令的顺序对我不起作用。无论-lyaml-cpp 是在命令的开头还是结尾,我都会遇到同样的问题。

任何帮助将不胜感激。

【问题讨论】:

你应该把-lyaml-cpp放在命令行的最后,在main.cpp之后 @VTT 谢谢,但不幸的是,这是我尝试过的许多编译参数安排之一。我刚刚又试了一次,得到了同样的结果。 嗯,那可能是某种二进制不兼容。 yaml 库导出哪些函数? yaml-cpp 是用-std=c++11 编译的吗? @VTT 虽然当-lyaml-cppmain.cpp 之前有一个额外的错误,看起来像这样:main.cpp:(.text+0x106): undefined reference to YAML::operator. This error goes away with the -lyaml-cpp` 在行尾。不确定这是否意味着什么 @VTT 我不确定在编译 yaml-cpp 时是否使用了-std=c++11。我在 Makefile 中找不到 g++。我将如何检查? 【参考方案1】:

@VTT 正确地将我指向 cmake 和编译器的东西。当我查看原始cmake 命令的结果时,前两行表示

-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5

即使 which gccwhich g++ 指向版本 5.4.0。我发现this SO answer 指向this cmake FAQ page 说您需要设置CCCXX 环境变量来指定不同的编译器。所以我将我的 cmake 命令更改为:

CC=$(which gcc) CXX=$(which g++) cmake -DBUILD_SHARED_LIBS=ON ..

现在一切正常。

【讨论】:

以上是关于yaml-cpp 编译错误:“未定义对 YAML::LoadFile 的引用”的主要内容,如果未能解决你的问题,请参考以下文章

RAD Studio 2010 中的错误 yaml-cpp 编译

来自 yaml-cpp 的编译器错误

yaml-cpp 不能用 g++ 编译

未定义对 YAML::LoadFile 的引用

未定义的参考 yaml-cpp

使用 yaml-cpp 0.5 DLL 时的链接器错误