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

whats the reason for the xml2-config not found while compiling libxml2?

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

gcc

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

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

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

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

如果您未能正确执行第 1 步,通常会收到类似 "error: 'xml.h' file not found" 的错误。

如果您未能正确执行第 2 步,通常会出现 "Undefined symbol: _xmlparse" 或 "library not found for -llibxml" 之类的错误。 ("Undefined symbol" 意味着编译器甚至不知道要查找库,所以它抱怨说没有定义可以在其中找到的函数。"library not found for -llibxml" 意味着你告诉编译器哪个要查找的库,但找不到。)

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

cc -Idirectory_where_extra_header_files_are -c test.c

你告诉 compiler/linker 使用 -l 标志加载额外的库:

cc test.o -llibxml

您使用 -L 标志告诉 compiler/linker 在何处 找到 附加库:

cc test.o -Ldirectory_where_extra_library_files_are -llibxml

但这可能很麻烦。许多第三方库都带有 "config" 程序,这些程序应该可以帮助您解决这个问题。像

这样的调用
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,您可能无法使用它。

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

做事"by hand"并非不可能,甚至也不是特别困难。在发明这种 "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