在 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 库:
- 项目->构建选项->链接器设置:添加了 src\.libs\libyaml.a
- 项目->构建选项->搜索目录->编译器:添加了包含库:yaml-0.2.5\include.
- 项目->构建选项->搜索目录->链接器:添加了包含库: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
来检查您的选项。
你说的是 Ubuntu
、C
和 yaml
。那将是:
1) New Project
->Console Application
->C
.
2) <Whichever project names you wish>
3)<Whatever compiler configuration you like>
那是创建一堆 CB
调用项目的文件。现在我不知道你使用的是哪种 yaml
库。但是你谈论 Ubuntu
和 C
所以...
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
按钮。选中新创建的标志前面的复选框。构建 & 运行.
我尝试用 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 库:
- 项目->构建选项->链接器设置:添加了 src\.libs\libyaml.a
- 项目->构建选项->搜索目录->编译器:添加了包含库:yaml-0.2.5\include.
- 项目->构建选项->搜索目录->链接器:添加了包含库: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
来检查您的选项。
你说的是 Ubuntu
、C
和 yaml
。那将是:
1) New Project
->Console Application
->C
.
2) <Whichever project names you wish>
3)<Whatever compiler configuration you like>
那是创建一堆 CB
调用项目的文件。现在我不知道你使用的是哪种 yaml
库。但是你谈论 Ubuntu
和 C
所以...
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
按钮。选中新创建的标志前面的复选框。构建 & 运行.