【问题标题】:Why Visual Studio 2015 couldn't find iconv.h, a file dependency of libxml2?为什么 Visual Studio 2015 找不到 libxml2 的文件依赖项 iconv.h?
【发布时间】:2016-03-23 21:53:39
【问题描述】:

我通常使用 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 &gt; Properties &gt; C/C++-&gt;General &gt; Additional Include Directoriesworkspace\libxml\libxml2-2.7.8.win32\libxml2-2.7.8.win32\include

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

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

  1. 无法打开源文件“iconv.h”

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

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

我的问题是:

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

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

【问题讨论】:

  • 使用#include "file" 而不是#include &lt;file&gt;。如果您还不了解基础知识,切勿从空项目开始。
  • @HansPassant 我尝试了你的建议,没有任何区别。问题不是#include 语句,问题必须在Project Properties 及其路径中,因为它无法找到位于#included 文件中的一个文件中的文件iconv.h
  • “iconv.h”在哪里?尝试使用 Windows Search 进行搜索。您可能需要将此路径“workspace\libxml\iconv-1.9.2.win32\iconv-1.9.2.win32\include”添加到其他头文件中。附加库是放置各种 *.lib 文件路径的地方。
  • 设置搜索路径时... 1) 对于编译,将有 3 个搜索路径,每个路径都以include 结尾。 2) 对于库,将有 3 个搜索路径,每个路径都以 lib 结尾。所以主要问题是 *.h 文件的路径需要扩展为具有所有三个路径。库的路径需要扩展为具有所有三个路径,并且这些路径需要以包含库的目录结束,而不是包含头文件的目录。
  • @user3629249 我按照您的建议进行了操作,并且奏效了。我从来不知道我们可以设置多条路径。提到的错误已经消失,现在我还有其他新错误,但我会处理它们。感谢您的回答,您可以将其作为答案,我会接受的。

标签: c visual-studio-2015 libxml2 iconv


【解决方案1】:

在设置搜索路径时...

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

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

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

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

【讨论】:

    【解决方案2】:

    这个问题的(更内部的)根本原因可能是 libxml2 非常不幸目前有 iconv(或:icu)库作为其public interface(此处为:encoding.h public interface header)定义的公开可见的transitive dependency。 :( (即,实现细节/细节泄露出特定的 - 没有那么明确的定义? - 接口)

    导致 libxml2 的所有无辜消费者都必须 提供 iconv / icu 库配置(包括路径 / 库搜索路径 / 库 / 标志)(通常通过完全托管/继承的基于目标实例的聚合配置自动隐式完成,例如在 CMake 上 - 而不是手动摸索/过度静态-syntax / non-functional 因此结构较弱的 MSVS/msbuild craptastics),也是。

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

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

    【讨论】:

    • 虽然您说的基本正确,但这并不能回答问题。
    猜你喜欢
    • 2016-06-21
    • 2016-11-14
    • 2019-03-09
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多