我试图用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
是朝向命令的开头还是结尾,我都会遇到同样的问题。
任何帮助都将不胜感激。
答案 0 :(得分:1)
@VTT是正确的指向我的cmake和编译器的东西。当我查看原始cmake
命令的结果时,前两行表示
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
即使which gcc
和which g++
指向版本5.4.0。我发现this SO answer指向this cmake FAQ page,表示您需要设置CC
和CXX
环境变量以指定不同的编译器。所以我把我的cmake命令改为:
CC=$(which gcc) CXX=$(which g++) cmake -DBUILD_SHARED_LIBS=ON ..
现在一切都很好。