【问题标题】:Include directory off-by one in libxml2 for nix在 libxml2 for nix 中逐一包含目录
【发布时间】:2020-01-13 11:11:18
【问题描述】:

我正在捆绑一个依赖于libxml 的.cpp 程序,但g++ 找不到它。我已经完成了使libxml 可用的适当步骤,但是目录结构与源预期的略有不同。我想知道这个问题的基于 nix 的解决方案。

编译器(来自 nix-shell 会话)说 libxml 不在我的系统路径中:

fatal error: libxml/encoding.h: No such file or directory
#include <libxml/encoding.h>

但是,它应该是。在我的 .nix 文件中,我确保包含 libxml2

buildInputs = [ ... libxml2 ...];

我的nix-shell 环境确认该库存在:

NIX_CFLAGS_COMPILE= [...] -isystem /nix/store/zf1nyqyx2zd6y944ln2rxnhd5m4265n4-libxml2-2.9.9-dev/include  [...]

如果我查看该目录,我发现搜索路径已关闭。文件的路径实际上是(相对于 NIX_CFLAGS_COMPILE 路径):

libxml2/libxml/encoding.h

我发现我可以通过在我的编译命令中添加以下选项来弥补这个偏一路径错误:

-isystem /nix/store/zf1nyqyx2zd6y944ln2rxnhd5m4265n4-libxml2-2.9.9-dev/include/libxml2

(与NIX_CFLAGS_COMPILE 相同的路径,但从libxml2 目录开始。)

鉴于这些信息,我想知道一个基于 nix 的解决方案来解决这个问题。源不是我的,所以改变它们是我想做的最后一件事。我看到了另外两个选择。

首先,我可以在buildPhase 期间触发的makefile 中添加路径。但是,我不确定如何简单地抓住这条路。例如,当我需要libxml2-2.9.9-dev 时,在我的派生中继承libxml2 使libxm2-2.9.9-bin 目录可用。我想我可以在NIX_CFLAGS_COMPILE 路径上使用grep 或sed,但我宁愿不这样做。

我的首选解决方案是基于 libxml2 进行简单的 libxml 派生,然后将其添加到我的 buildInputs 中,但这似乎也不简单。

【问题讨论】:

    标签: gcc libxml2 include-path nix


    【解决方案1】:

    尝试运行pkg-config --cflags libxml-2.0 以获得适当的编译器选项。

    如果一切配置正确,它将在您的计算机上找到适当的/nix/store/*-libxml2-2.9.9-dev/lib/pkgconfig/libxml-2.0.pc 文件,并从中提取所需的编译器选项。

    您可以使用这样的单行代码调用 GCC:

    g++ program.cpp $(pkg-config --libs --cflags libxml-2.0) -o program
    

    这是一个通用的解决方案,不仅适用于 Nix,但您应该能够通过确保您的 PATH 上具有 pkg-config 实用程序并确保设置正确的环境变量来使其在 Nix 中工作它可以找到libxml2。 Nix 可能有一堆 shell 脚本或其他东西可以帮助您以这种方式设置环境,因为这是一个常见的需求。

    【讨论】:

      【解决方案2】:

      我通过在派生中定义libxml 属性并将其添加到我的buildInputs 来解决这个问题。新库只是到旧库的链接,但路径已更正。以下是推导的相关部分:

      { stdenv, libxml2, ... } : stdenv.mkDerivation
      rec
      { buildInputs = [ libxml ];
        libxml = stdenv.mkDerivation {
          name = "libxml" ;
          system = builtins.currentSystem;
          outputs = [ "bin" "dev" "out" ];
          phases = ["buildPhase"];
          buildPhase =
            ''echo "my command out = $out"
              echo ${libxml2.dev}
              mkdir -p $out
              mkdir -p $dev
              mkdir -p $bin
              ln -s ${libxml2.dev}/include/libxml2 $dev/include
              ln -s ${libxml2.dev}/lib $dev/lib
            ''; };
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 2016-08-21
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        相关资源
        最近更新 更多