yaml-cpp使用备忘

yaml是一种读取配置文件的开源库,新项目主要使用的是这个作为读取配置的工具(之前是xml和json,后面有空可以做个之间的对比)。但cpp并没有原生的读取yaml文件的接口,所以我们需要下载源码然后编译生成库文件。

使用yaml-cpp

yaml-cpp 是一个开源库,地址在 github 上,https://github.com/jbeder/yaml-cpp

yaml-cpp 是通过 CMake 来进行构建和编译的。

CMake具体细节可以先不做研究,后面只需要使用CMake对工程进行构建就好了。

首先下载源码。下载好后其实具体使用步骤在yaml-cpp/install.txt中也有具体描述。

然后,在源码目录创建一个 build 文件夹。切换到build文件夹,然后执行cmake

1
2
3
mkdir build
cd build
cmake ..

注意的是 cmake 后面是 ..,这代表从 build 上一层目录查找 CMakeLists.txt (如果你的build目录在别处就是别的相对路径了),然后编译的文件都会存放在 build 文件夹,如果对编译的效果不满意,只要删除 build 文件就好了,其他源码目录并不受影响,这是 cmake 编译时的基本套路。

yaml-cpp 默认构建的就是静态库,也就是 unix 类系统下的 .a 文件,如果你想构建动态库的话,就需要在 cmake 时指定。

1
cmake ..  -D BUILD_SHARED_LIBS=ON

编译成功后,会生成库文件,你只需要将库文件和头文件拷贝到你自己的工程当中,就可以使用了。

上面下划线是原文当中的做法,更好的做法是根据install.txt中的做法,直接执行

1
make install

对应的.so文件会被安装到系统目录下去。笔者自己执行后对应yaml-cpp一系列的so文件是到了usr/local/lib64

安装新的动态库到linux

这边顺带提下,安装新的三方库到linux系统下,如果不做任何处理,你直接编译执行需要使用这个库的程序是会报如下错误的

error while loading shared libraries: libyaml-cpp.so: cannot open shared object file: No such file or directory

意思是系统找不到对应的动态库文件***.so,一般linux系统都是去/usr/lib下找的,上面提到我们这次安装的yaml-cpp被安装到了usr/local/lib64

  1. 首先打开/etc/ld.so.conf文件
  2. 加入动态库文件所在的目录:执行vim /etc/ld.so.conf,在"include ld.so.conf.d/*.conf"下方增加/usr/local/lib64。(大部分其他库会被安装到/usr/local/lib下,那就加这个目录,笔者的配置这俩都已经加进去了)
  3. 保存后,在命令行终端执行:/sbin/ldconfig -v;其作用是将文件/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache以供使用。因此当安装完一些库文件,或者修改/etc/ld.so.conf增加了库的新搜索路径,需要运行一下ldconfig,使所有的库文件都被缓存到文件/etc/ld.so.cache中,如果没做,可能会找不到刚安装的库。

这样执行完后,使用了yaml-cpp的程序就能正常运行了。

当然稍微大点的工程在使用第三方库时肯定会在Makefile中include进去,另一篇文章会介绍一个简单工程的Makefile的编写,里面包含了如何将yaml-cpp带进自己的工程中去编译使用。

参考文章

c++ 开发中利用yaml-cpp读写yaml配置文件

Linux中error while loading shared libraries错误解决办法