在 yaml.h 库中找不到函数 (C)

Fail to find a function in yaml.h library (C)

我尝试用 C (Code::Blocks IDE) 读取一个 yml 文件,但我收到 yaml_parser_initialize:

的未定义引用错误
#include <stdio.h>
#include <stdlib.h>
#include <yaml.h>

int main(){
    FILE *fh = fopen("configuration.yaml", "r");
    yaml_parser_t parser;

    /* Initialize parser */
    if(!yaml_parser_initialize(&parser))
        fputs("Failed to initialize parser!\n", stderr);
    
    fclose(fh);    
    return 0;}

函数存在于yaml.h。我按如下方式链接了 yaml 库:

  1. 项目->构建选项->链接器设置:添加了 src\.libs\libyaml.a
  2. 项目->构建选项->搜索目录->编译器:添加了包含库:yaml-0.2.5\include.
  3. 项目->构建选项->搜索目录->链接器:添加了包含库:yaml-0.2.5\include.

OS: Win10

提前致谢。

简而言之,我会尝试回答这个问题并根据要求更新我的回答。

如果您在 Linux OS 上构建,无论您的主机 OS 是 Windows(您可以 运行 Linux 作为一个虚拟机),你通常 link 使用 .a.so 库文件。

如果你的搭建环境是Windows,不管主机OS,那么你通常link用.lib或者.dll 库。

也就是说,上面提到的 OS 对于如何提供文件路径有不同的约定。 在 Linux 上,路径是这样的:/path/to/libs/libyaml.a。 在 Windows 上,路径是这样的 C:\Program Files\libs\yaml.lib

运行 在 OS 上的任何应用都遵循 OS 路径约定。在您的情况下,Code::Blocks 要求您提供访客 OS 所在的约定中的路径。

下面的文字是使用 yaml 库 ob Ubuntu.

构建代码的两种方法

更新

我现在不使用 Code::Blocks。我已经安装了 IDE 来检查您的选项。 你说的是 UbuntuCyaml。那将是:

1) New Project->Console Application->C.

2) <Whichever project names you wish>

3)<Whatever compiler configuration you like>

那是创建一堆 CB 调用项目的文件。现在我不知道你使用的是哪种 yaml 库。但是你谈论 UbuntuC 所以...

1) apt search libyaml-><guess what yaml are>->apt install libyaml-dev

2) pkg-config --list-all | grep yaml 得到 yaml-0.1 的输出。这是我想提供的名称作为 pkg-config.

的参数

顺便说一句,您似乎获得了不同版本的 yaml 库。但是,我们仍然需要知道适当的字符串作为编译器和 linker 参数提供。

3) pkg-config --libs 得到我 -lyaml

4) pkg-config --cflags 让我空行。因此构建环境的包含路径是well-known

这样,我们就知道了 linker 参数 (-lyaml) 和编译器参数 (<empty string>)。现在我尝试将它们插入 CB 可以找到它们的地方。

1) 菜单选项:Project->Build options... 2) Compiler settings-> 无变化 3) Linker settings->link libraries->yaml

CB中的库应该没有-l前缀,所以应该和上面一样。点击构建,一切正常。

更新 git 版本

看来你的 yaml 版本比我的发行版要新。如果您需要最新版本,请从 git.

安装

1)apt remove libyaml-dev。这样就不会与库版本冲突。

我确实选择了 Canonical repository for libyaml,因为我的发行版是 Ubuntu。您需要 mkdir 获取源代码并 cd 该目录。

2) git clone https://github.com/yaml/libyaml

3) cd libyaml

4)按照instructions搭建安装

5) pkg-config --list-all | grep yaml 得到我 yaml-0.1 6) pkg-config --cflags yaml-0.1 产生 -I/usr/local/include 7) pkg-config --libs yaml-0.1 得到这个 -L/usr/local/lib -lyaml

好的,我们得到了库的编译器和 linker 标志。 link library 选项保持不变。您需要将 -L/usr/local/lib 添加到 Other linker options。我没有找到可以添加编译器标志的位置,所以我添加了新标志。在 CB 中,将是 Compiler flags-><right mouse click>->New flag。以某种方式命名标志并将 -I/usr/local/include 字符串插入 Compiler flags 输入行。点击 OK 按钮。选中新创建的标志前面的复选框。构建 & 运行.