c - 编译 libxml2 时找不到 xml2-config 的原因是什么?

标签 c xml xml-parsing libxml2 xml-libxml

程序是在windows Gcc mingw中运行一个c程序解析一个xml文件。 但是在编译时我得到了 xml2-config not found ,--libs unrecognized commands,--cflags unrecognized commands。

海湾合作委员会enter image description here

我已将 libxml 文件“libxml libxslt iconv”添加到环境路径。

enter image description here

最佳答案

当您编写使用第三方库(如 libxml)的程序时,通常你有两个问题:

  1. 您需要告诉编译器库的头文件安装在哪里,这样当您的代码显示类似#include <xml.h> 的内容时编译器将能够找到它们。

  2. 您需要告诉链接器库本身的安装位置。

如果您未能正确执行第 1 步,通常会收到类似“错误:找不到‘xml.h’文件”的错误。

如果您没有设法正确执行第 2 步,您通常会收到类似“ undefined symbol :_xmlparse”或“找不到 -llibxml 的库”之类的错误。 (“ undefined symbol ”意味着编译器甚至不知道要查找该库,因此它会提示说没有可以在其中找到的函数的定义。“找不到 -llibxml 的库”意味着您告诉编译器要查找哪个库,但找不到它。)

在 Unix 下的 C 编译器上,无论如何,您使用 -I 告诉编译器在哪里查找头文件。标志,像这样:

cc -Idirectory_where_extra_header_files_are -c test.c

您告诉编译器/链接器使用 -l 加载额外的库标志:

cc test.o -llibxml

您使用 -L 告诉编译器/链接器在哪里找到那个额外的库标志:

cc test.o -Ldirectory_where_extra_library_files_are -llibxml

但这可能会很麻烦。许多第三方库都带有“配置”程序,这些程序应该可以帮助您解决这个问题。像这样的调用

xml-config --cflags

打印字符串

-Idirectory_where_the_libxml_header_files_are

所以你知道要添加什么到 cc修复问题 1 的行。还有一个类似的调用

xml-config --libs

打印字符串

-Ldirectory_where_the_libxml_libraries_are -llibxml

所以你知道要添加什么到 cc修复问题 2 的行。

然后,最后,这个工具旨在用于 Unix shell 的一种特殊机制,反引号,它允许您获取一个命令的输出并将其插入另一个命令行:

cc `xml-config --cflags --libs` test.c

这实际上运行了 xml-config命令,收集其输出(即 xml-config 打印出的任何内容),并将该输入插入命令行,就像您键入它一样,然后最终运行 cc命令与那些额外的参数。这是一种方便的机制,但如果您使用的是 Windows,则可能无法使用它。

所以如果您在类 Unix 系统上并且如果 xml-config程序安装在 shell 可以找到的位置,如果头文件和库安装在 xml-config 的位置认为它们是,然后使用 xml-config可以很方便。但是,如果这些事情中的任何一个不是真的,整个机制就会崩溃,您可能不得不“手动”做事。

“手工”做事并非不可能,甚至也不是特别困难。在发明这种“配置”工具帮助机制之前,我们总是这样做。如上所述,只需使用 -I编译时告诉编译器头文件在哪里:

cc -Idirectory_where_the_libxml_header_files_are -c test.c

使用 -L-l告诉它图书馆在哪里:

cc test.o -Ldirectory_where_the_libxml_libraries_are -llibxml

关于c - 编译 libxml2 时找不到 xml2-config 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57269920/

相关文章:

c - 从c中的函数返回字符串

xml - Xquery 如何从一组 xml 记录中的一组 xml 节点中提取独特术语?

java - 如何使用 Stax 解析器解析 XML

C++:无法使用 Mini-XML 从 XML 文件加载长字符串

c - 动态分配矩阵并处理所有错误的函数

c - 在 Solaris 上使用 Perl,如何导入 C (.so) 库?

xml - 使用 XSLT 转换在 WordProcessingML 中保留换行符和空格

java - 解析 xml 特殊字符问题

c - 使用 bash + 环境变量替换文件中的字符串

jquery - 我如何修改这个 jQuery XML 解析器?