【问题标题】:whats the reason for the xml2-config not found while compiling libxml2?编译 libxml2 时找不到 xml2-config 的原因是什么?
【发布时间】:2019-07-30 10:47:40
【问题描述】:

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

gcc

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

【问题讨论】:

  • xml-config 是一个应该与libxml 一起安装的工具,以帮助您的 Makefile 找到它。但是如果您手动安装了libxml,那么如果根本没有安装xml-config 也就不足为奇了。 (而xml-config 的官方副本可能不知道您选择将库自己安装在哪里。)
  • 有下载安装链接吗?
  • gcc test.c -llibxml 开头。它可能会说“找不到头文件 xml.h”。然后说gcc -Iwhere_I_put_them test.c -llibxml,将where_I_put_them 替换为您放置xml.h 的目录。然后它可能会说“找不到libxml”。然后尝试gcc -Iwhere_I_put_them test.c -Llibdir -llibxml,将libdir 替换为您放置库的目录。你真的不需要xml-config,它只是一个试图让剩下的事情变得更容易的工具。
  • 您遇到的另一个问题是您使用的 Windows 命令行似乎不支持 Unix 反引号机制。

标签: c xml xml-parsing libxml2 xml-libxml


【解决方案1】:

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

  1. 你需要告诉编译器库的头文件安装在哪里,这样当你的代码说像#include <xml.h>这样的东西时,编译器就能找到它们。

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

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

如果您未能正确执行第 2 步,您通常会收到类似“未定义符号:_xmlparse”或“未找到 -llibxml 的库”之类的错误。 (“未定义符号”表示编译器甚至不知道要查找该库,因此它抱怨没有可以在其中找到的函数的定义。“未找到 -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,则可能无法使用它。

所以if你在一个类Unix系统上ifxml-config程序安装在shell可以找到它的地方ifem> 头文件和库安装在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多