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

时间:2018-05-26 16:47:32

标签: c++ g++ yaml-cpp

我试图用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.6和{{ 1}}。如果重要的话,我的cmake是版本3.11.2。

不确定这是否有用,但我首先将yaml-cpp的维护者作为github issue运行此问题,他说

  

可能是配置错误;如果你在Stack Overflow上询问,你或许可以得到答案。

我也发现了一个类似的问题几乎完全相同的问题,但重新排列编译命令顺序的solution对我来说并不起作用。无论libyaml-cpp.so是朝向命令的开头还是结尾,我都会遇到同样的问题。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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 ..

现在一切都很好。