yaml-cpp 不能用 g++ 编译

Posted

技术标签:

【中文标题】yaml-cpp 不能用 g++ 编译【英文标题】:yaml-cpp doesn't compile with g++ 【发布时间】:2013-06-12 09:21:30 【问题描述】:

我需要让 yaml-cpp 运行,但它无法编译而不会出现错误。我正在使用来自here 的 Ubuntu 12.04 和 yaml-cpp-0.5.1,它们是使用“cmake”和“sudo make install”安装的,以确保将库正确复制到所需的路径“/usr/local/”包含/yaml-cpp'。

出于测试目的,我尝试编译了几行代码

#include "yaml-cpp/yaml.h"
int main(int argc, char **argv) 
    YAML::Node config = YAML::Load("[1,2,3]");
    return 0;

我基本上是从这个页面here得到的。如果我现在运行

g++ -o yaml_test yaml_test.cpp

g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o yaml_test yaml_test.cpp

我总是收到相同的错误消息

/tmp/ccgvKdN2.o: In function `main':
yaml_test.cpp:(.text+0x1d): undefined reference to `YAML::Load(char const*)'

据我所知,这意味着尚未找到库。

这里发生了什么?为什么不直接编译?

【问题讨论】:

你能确认libyaml-cpp.a/usr/local/lib中吗? 是的,事实就是这样。 您可以尝试将libyaml-cpp.a 复制到与yaml_test.cpp 相同的目录并重新编译吗? 还有一件事:你能检查你的包是否安装了不同版本的 yaml-cpp 吗?例如,查看/usr/lib,并在/usr/local/lib 中查看libyaml-cpp.*,看看是否已经存在旧的动态库。 好的,我复制了这个文件,但它并没有改变错误信息。我在/usr/lib/usr/local/lib 中找到了文件libyaml-cpp.solibyaml-cpp.so.0.2libyaml-cpp.so.0.2.7libyaml-cpp.a。我猜这意味着包管理器安装了 0.2.7 版本,而我手动安装了 0.5.1,这可能会导致某种混乱。我已经尝试过sudo aptitude remove yaml-cpp,这是一个非常糟糕的主意,因为它还删除了我仍在使用的许多其他东西。所以我不得不重新安装所有东西。还有其他方法可以删除这个包吗? 【参考方案1】:

根据您的评论,您的系统中似乎已经安装了 yaml-cpp 0.2.7。你有两个选择:

    从系统中删除现有软件包。我不确定aptitude 究竟是如何工作的,但您可以尝试简单地删除文件/usr/local/lib/libyaml-cpp.*/usr/local/include/yaml-cpp/,然后从头开始安装yaml-cpp 0.5.1。 (请注意,您可能也与头文件有冲突,但幸运的是它已正确解决。我会删除 0.2.7 头文件,然后重新安装 0.5.1。)

    您可以将 0.5.1 安装到单独的位置(例如,$HOME/lib$HOME/include),然后确保在路径变量中的 /usr/local 之前检查这些目录。

我可能会选择选项 #1,因为我不确定您为什么需要同时安装这两个选项。我想你的包管理器想要安装的其他一些包可能会依赖于 yaml-cpp 0.2.7,这可能是个问题。

【讨论】:

好的,我现在删除了我在/usr/lib/usr/local/lib/usr/include/usr/local/include 中找到的所有 yaml-cpp 内容,并重新安装了 yaml-cpp 0.5.1。不幸的是,由于某种原因,我仍然遇到与以前相同的错误,因此版本 0.2.7 安装毕竟不是问题... 其他地方有东西吗? /opt?如果您实际上链接到从 0.5.1 构建的 libyaml-cpp.a,那么您将不会收到此错误,因此必须链接其他内容。也许尝试选项#2? 我也尝试了选项#2,不幸的是它没有任何改进。只是为了确保我正确理解:-I/usr/local/include 似乎工作正常,但应该链接文件 /usr/local/lib/libyaml-cpp.a-L/usr/local/lib -lyaml-cpp 不起作用。但是文件libyaml-cpp.a本身已经找到了,否则会出现错误/usr/bin/ld: cannot find -lyaml-cpp而不是yaml_test.cpp:(.text+....): undefined reference to ... 总而言之,这意味着所有文件都已正确加载,但仍未找到所有 YAML 函数。 否 - 大概它正在为 yaml-cpp 找到 some 库,但不是您从 0.5.1 编译的版本(否则它会找到参考!)。我认为您也许可以将.a 文件显式传递给gcc;不要传递-L... -lyaml-cpp,而是尝试将/usr/local/lib/libyaml-cpp.a 附加到命令行参数。【参考方案2】:

使用 ldd 命令检查所有需要的库是否正确链接。

ldd ./yaml_test

    linux-vdso.so.1 =>  (0x00007fff631bc000)
    **libyaml-cpp.so.0.6 => not found**
    libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f6e99a93000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f6e99791000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f6e9957b000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f6e991b7000)
    /lib64/ld-linux-x86-64.so.2 (0x00005614b86c1000)

如果丢失任何库链接,请导出 LD_LIBRARY_PATH。

导出 LD_LIBRARY_PATH=<.so>:$LD_LIBRARY_PATH

【讨论】:

以上是关于yaml-cpp 不能用 g++ 编译的主要内容,如果未能解决你的问题,请参考以下文章

未定义的参考 yaml-cpp

尝试构建库时出现 yaml-cpp 编译器错误

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

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

ROS交叉编译——protobuf/yaml-cpp/opencv

用 g++ 编译的奇怪代码