YAML(读作 /ˈjæməl/)是一种配置文件解决方案,规定了一种配置文件的书写格式,对应的解析方法,和多种高级语言的API。
最近在为我毕业论文的数据集搭建一个标注工具。具体地,需要把图像中缺陷以人工圈画的方式标注;然后由工具转换成一个YAML配置文件进行数据转储;最后需要解析这个YAML文件并输出标注部分的一些信息,比如像素坐标、像素值信息等。
我用过的同类解决方案还有xml、json等。这次想着用一个没用过的嘛。。。
下面是一个简单的YAML配置文件书写例子,有个直观印象:
pictures:
# defect1
-
num: 1
defects:
-
x_col: 504 # 480 # 503
y_row: 664 # 640 # 664
cols: 4 # 50 # 5
rows: 4 # 50 # 6
# defect54
-
num: 54
defects:
-
x_col: 970
y_row: 371
cols: 6
rows: 2
- # 灰尘
x_col: 38
y_row: 788
cols: 4
rows: 2
YAML语法简介:YAML文件简介 - stardsd - 博客园 (cnblogs.com)
YAML-CPP VS配置方法:(1条消息) Windows10下使用VS2017编译和使用yaml-cpp库_雪域迷影的博客-CSDN博客
基础环境:Win10、VS2017、c/c++、cmake
yaml-cpp官网:https://github.com/jbeder/yaml-cpp
可以直接在github中下载Zip到windows中想要放置源码的路径。
或者,如果安装了git for windows,可以用命令行在指定路径下载:
git clone https://github.com/jbeder/yaml-cpp.git
打开下载的路径,在其中新建两个子文件,命名为:build
、build_x64
。分别用来编译32位版本和64位版本。如下图:
打开新建的文件夹,比如build
文件夹,在文件夹中按住shift
+ 鼠标右键
、选择“在此处打开PowerShell窗口“。
我们想在build文件夹中构建32位版本,所以这里的camke命令是:
> cmake .. # 默认构建一个32位的工程,用上一级目录中的cmakelist.txt和其他文件进行构建
这里比较坑,**如果你的vs环境是x64的,那么你直接这样cmake就踩坑了!!!**注意通过这个最终编译出来的静态库是32位的!
如果要构建一个64位的工程,那么你应该这样:
打开刚刚新建的build_x64
文件夹,在其中打开PowerShell:
> cmake -G "Visual Studio 15 2017 Win64" .. # 参数意为:构建出一个VC15,vs2017的,64位工程
具体编译命令需要到github的YAML-CPP官网查看:https://github.com/jbeder/yaml-cpp
(反正我是没看到其他博客有说这个细节的,然后我就被坑了。。。)
2.2cmake构建的产物是一个VS解决方案(.sln文件,在对应的build文件夹中)。
打开这个.sln文件会发现这个解决方案中有很多工程,很有用的是其中两个:ALL_BUILD
工程和yaml-cpp-tests
工程。下面逐一介绍一下这两个工程的用途:
用来生成yaml-cpp库的静态库,以供你的工程使用yaml的功能。
选中ALL_BUILD工程,选好你需要的平台,这里有4种平台可选,但常用的还是debug或release:
选好了之后就是我们喜闻乐见的**”生成“**。这个按钮背后会对源文件进行编译,生成一些目标文件和可执行文件,还有就是我们需要的静态链接库文件:yaml-cpp.lib
这个静态链接库文件在这样的路径下,很容易找到:
静态库里装着打包了这个工程中所有编译符号的定义(实现),所以到时候在自己的工程里,只需要指定yaml库的头文件路径和静态库文件路径,你的工程就可以顺利链接成功,不需要那么多源文件啦!
这是一个yaml-cpp自带的单测工程,**这鸡汤,十分滴珍贵!**可得好好利用,里面有各种API的用法,还有一个东西很关键,值得参考——就是 yaml-cpp-tests工程的配置属性:
图4 yaml-cpp-tests工程的配置属性
当你自己的工程出现令人发指的链接错误时,不妨先试试这个工程在你的机器上能否跑通?能跑通的话,看看这里的配置,对比一下看差在哪了?
打开你自己的工程文件,下面就要开始自己的配置了,这是最关键、最易错的一步,咱们就以上面的yaml-cpp-tests工程为例:
此步骤缺少或错误可能引发的错误提示:
编译错误,无法打开头文件。
就像刚刚说的,静态库文件提供了所有符号的实现,但代码库所有头文件的路径,外部工程必须要拿到。
所以这里需要加上include路径,src路径是没有必要的。相当于告诉编译器该去哪个路径中找符号所有在的头文件,拿到符号的声明。
此步骤缺少或错误可能引发的错误提示:
链接错误,LINK2001——无法解析的外部符号。
这里就比较坑了啊,网上所有的教程貌似都没提到这个,但我的工程不配置这个还真就不行。要把这里所有的项全复制到自己的工程里才行。。
此步骤缺少或错误可能引发的错误提示:
链接错误,LINK2019——无法解析的外部符号。
这里要写好绝对路径,不能写错咯。
最后,做好以上的配置,只要你的VS平台与yaml生成的版本一致,应该是可以顺利通过编译链接啦!
其实通过这个配置,我们最应该掌握的就是c/c++工程的组织方法:通过 头文件 和 静态链接库获取所有符号的声明和定义,从而顺利进行编译和链接步骤。这种在大型工程中可以有效减少整个工程的代码量,压缩代码库大小,同时又不影响运行时性能 以及 程序员查看符号的声明。