编译 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
)的程序时,通常会遇到两个问题:
您需要告诉编译器库的头文件安装在哪里,这样当您的代码说 #include <xml.h>
之类的内容时,编译器将能够找到它们。
您需要告诉链接器库本身的安装位置。
如果您未能正确执行第 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
程序是运行一个c程序在windowsgcc mingw中解析一个xml文件。 但是在编译时我得到 xml2-config not found ,--libs unrecognized commands, --cflags unrecognized commands.
gcc
我已将 libxml 个文件 "libxml libxslt iconv" 添加到环境路径。
当您编写使用第三方库(如 libxml
)的程序时,通常会遇到两个问题:
您需要告诉编译器库的头文件安装在哪里,这样当您的代码说
#include <xml.h>
之类的内容时,编译器将能够找到它们。您需要告诉链接器库本身的安装位置。
如果您未能正确执行第 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