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.so
、libyaml-cpp.so.0.2
和libyaml-cpp.so.0.2.7
和libyaml-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++ 编译的主要内容,如果未能解决你的问题,请参考以下文章
RAD Studio 2010 中的错误 yaml-cpp 编译
yaml-cpp 编译错误:“未定义对 YAML::LoadFile 的引用”