为什么Visual Studio 2015 找不到iconv.h,一个libxml2 的文件依赖?

Why Visual Studio 2015 couldn't find iconv.h, a file dependency of libxml2?

我通常使用 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/

我在项目属性中输入了以下路径:

  1. Project > Properties > C/C++->General > Additional Include Directoriesworkspace\libxml\libxml2-2.7.8.win32\libxml2-2.7.8.win32\include

  2. Project > Properties > Linker > General > Additional Library Directoriesworkspace\libxml\iconv-1.9.2.win32\iconv-1.9.2.win32\include

我不知道 zlib 文件夹路径放在哪里。 (第一个问题) 我在 Visual Studio Professional 2015 (Windows 8, 64 bit) 中构建了解决方案,但出现以下错误:

  1. 无法打开源文件"iconv.h"

  2. C1083 无法打开包含文件:'iconv.h':没有那个文件或目录

GTK:我创建了:文件 > 项目 > VC++ > 空项目

我的问题是:

  1. 三个文件夹(从下载的包中)应该放在哪里,具体在哪个路径?

  2. 我必须创建独立的应用程序,所以我必须静态 link libxml2 Dll,我这样做对吗?

设置搜索路径时...

1) 对于编译,将有 3 个搜索路径,每个路径都以 include 结尾。

2) 对于库,将有 3 个搜索路径,每个路径都以 lib 结尾。

所以主要问题是 *.h 文件的路径需要扩展以包含所有三个路径。

库的路径需要扩展以包含所有三个路径,并且这些路径需要以包含库的目录结束,而不是包含头文件的目录。

这个问题的(更内部的)根本原因可能是 libxml2 很不幸目前有 iconv(或:icu)库作为其public接口的公开可见传递依赖(此处:encoding.hpublic接口头)定义。 :( (即,实现 details/specifics 从特定的泄漏 - 定义不明确? - 接口)

导致 libxml2 的所有无辜消费者都必须 提供 iconv / icu 库配置(包括路径/库搜索路径/库/标志)(通常通过完全 managed/inherited 基于目标实例的聚合配置自动隐式完成,例如在 CMake 上 - 而不是手动摸索/过于静态的语法/非功能性结构也很弱MSVS/msbuild craptastics)。

并且(一旦成功处理了这些额外的配置恶作剧),雪上加霜的是,一个然后 通常以“未使用的库:”诊断项 (iconv.lib) 结束 - 读取:膨胀/性能后果 - 在使用 MSVC cl.exe /VERBOSE:UNUSEDLIBS 诊断时在 libxml2 消费者端:( (因为 libxml2 的消费者显然通常也不会(需要)自己直接使用 iconv)。

并不是说所有这些细节目前对那些由于这个 API 接口错误而痛苦地面对配置失败的人来说很重要:(