我通常用PHP编写代码,是Visual Studio和C的新手,我按照这里的步骤 - http://www.codeguru.com/cpp/data/data-misc/xml/article.php/c14893/Libxml2-Everything-You-Need-in-an-XML-Library.htm并下载了三个文件 - libxml,iconv,zlib。它说,iconv和zlib是libxml2的依赖项。
我的代码如下:
#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
static void print_element_names(xmlNode * a_node)
{
xmlNode *cur_node = NULL;
for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
if (cur_node->type == XML_ELEMENT_NODE) {
printf("node type: Element, name: %s\n",
cur_node->name);
}
print_element_names(cur_node->children);
}
}
int main(int argc, char **argv)
{
xmlDoc *doc = NULL;
xmlNode *root_element = NULL;
if (argc != 2) return(1);
LIBXML_TEST_VERSION // Macro to check API for match with
// the DLL we are using
/*parse the file and get the DOM */
if (doc = xmlReadFile("http://www.w3schools.com/xml/note.xml", NULL, 0)) == NULL){
printf("error: could not parse file %s\n", argv[1]);
exit(-1);
}
/*Get the root element node */
root_element = xmlDocGetRootElement(doc);
print_element_names(root_element);
xmlFreeDoc(doc); // free document
xmlCleanupParser(); // Free globals
return 0;
}
在我下载的软件包中,我有文件夹 - iconv-1.9.2.win32,libxml2-2.7.8.win32,zlib-1.2.5.win32。 [所有这些文件夹并排放在workspace\libxml
文件夹中]
我是从这里下载的 - ftp://ftp.zlatkovic.com/libxml/
我在项目属性中输入了以下路径:
Project > Properties > C/C++->General > Additional Include Directories
- workspace\libxml\libxml2-2.7.8.win32\libxml2-2.7.8.win32\include
Project > Properties > Linker > General > Additional Library Directories
- workspace\libxml\iconv-1.9.2.win32\iconv-1.9.2.win32\include
我不知道在哪里放置zlib
文件夹路径。 (第一个问题)
我在Visual Studio Professional 2015(Windows 8,64位)中构建了解决方案,并出现以下错误:
无法打开源文件“iconv.h”
C1083无法打开包含文件:'iconv.h':没有这样的文件或目录
GTK:我创建了:文件&gt;项目&gt; VC ++&gt;空项目
我的问题是:
我应该在哪里放置来自所有三个文件夹(来自下载的包)的特定路径?
我必须创建独立应用程序,所以我必须静态链接libxml2 Dll,我是否正确?
答案 0 :(得分:0)
...
1)对于编译,将有3个搜索路径,每个搜索路径都包括在内。
2)对于库,将有3个搜索路径,每个搜索路径都以lib结尾。
所以主要问题是* .h文件的路径需要扩展为包含所有三个路径。
库的路径需要扩展为包含所有三个路径,并且这些路径需要以包含库的目录结束,而不是包含头文件的目录。
答案 1 :(得分:-1)
这个问题的(更内部的)根本原因可能是 libxml2 非常不幸目前有 iconv(或:icu)库作为其公共接口(此处: encoding.h 公共接口标头)定义的公开可见的传递依赖。 :( (即,实现细节/细节泄漏出特定 - 不是很好定义? - 接口)
导致 libxml2 的所有无辜消费者都必须 提供 iconv/icu 库配置(包括路径/库搜索路径/库/标志)(通常通过完全托管/继承的基于目标实例的聚合配置自动隐式完成,例如在 CMake 上 - 而不是手动摸索/过度静态- 语法/非功能性因此结构较弱的 MSVS/msbuild craptastics),也是。
而且(一旦这些额外的配置诡计被成功处理),雪上加霜,然后 通常以“未使用的库:”诊断项目(iconv.lib)结束 - 阅读:膨胀/性能后果 - 在使用 MSVC cl.exe /VERBOSE:UNUSEDLIBS 诊断时在 libxml2 消费者端:( (因为 libxml2 的使用者显然通常不会(也需要)自己直接使用 iconv)。
并不是说所有这些细节目前对那些由于这个 API 接口错误而痛苦地面临配置失败后果的人来说都很重要:(