为什么Rust build.rs找不到C头文件?

为什么Rust build.rs找不到C头文件?,rust,compiler-errors,dpdk,Rust,Compiler Errors,Dpdk,基本上,我试图建立一个有build.rs文件的板条箱。 这个板条箱位于一个更大的项目中,应该是一个lib板条箱。 在这个build.rs文件中,我试图编译一个.C文件,其中包含两个头文件 有趣的事实:我从另一个小的演示板条箱中得到了build.rs文件和板条箱结构,在这个演示板条箱中,我可以用这些头编译这个精确的C文件 此处出现完全错误: 以下是github的链接: 这就是我所说的板条箱,你也可以看到它所在的更大的项目。在自述文件中,您可以看到完整的错误 无论是从大型项目的根目录还是从这个有问题

基本上,我试图建立一个有build.rs文件的板条箱。 这个板条箱位于一个更大的项目中,应该是一个lib板条箱。 在这个build.rs文件中,我试图编译一个.C文件,其中包含两个头文件

有趣的事实:我从另一个小的演示板条箱中得到了build.rs文件和板条箱结构,在这个演示板条箱中,我可以用这些头编译这个精确的C文件

此处出现完全错误:

以下是github的链接:

这就是我所说的板条箱,你也可以看到它所在的更大的项目。在自述文件中,您可以看到完整的错误

无论是从大型项目的根目录还是从这个有问题的板条箱的根目录进行货物构建,错误都是一样的

“cargo:warning=/usr/include/asm generic/errno.h:5:10:致命错误:asm generic/errno base.h:没有这样的文件或目录 货物:警告=5 |#包括“

根据我在build.rs中执行的.flag(“-I/path/。”)调用,丢失的文件可能会更改

正如您所看到的,现在它无法找到errno base.h,但我包含了asm generic的路径

这是C文件编译工作所在的板条箱中build.rs文件的代码,您可以看到,在调用compile之前,我不必添加任何include标志

fn main() {
// Tell cargo to tell rustc to link the system bzip2
// shared library.
// println!("cargo:rustc-link-lib=rte_ring");
// println!("cargo:rustc-link-lib=rte_mempool");

// Tell cargo to invalidate the built crate whenever the wrapper changes
// println!("cargo:rerun-if-changed=wrapper.h");

let _src = ["src/static-functions.c"];
println!("cargo:rerun-if-changed=build.rs");

let mut builder = cc::Build::new();

let build = builder
    .file("src/static-functions.c")
    .flag("-Wno-unused-parameter");
build.compile("foo");
}

其他信息:

  • 有问题的板条箱非常小,请参见上面的链接。有build.rs文件、C文件和头文件在include目录中

  • 我怀疑的一点是,更大项目的目标是:

  • TARGET=Some(“x86_64-unknown-linux-musl”)

    可能会影响C文件的编译方式

    在编译工作的项目中,我没有使用LinuxMUSL

  • 说到生锈,我是个十足的傻瓜,但我确实对C/C++的工作原理有相当的了解

  • 我正在Ubuntu 20.04上运行这个项目

  • 这些缺少的头是导入DPDK头的结果,我在有问题的机器上安装了DPDK库


  • 如果您有任何问题,请告诉我,很抱歉读了这么长时间,谢谢。

    我通过调整cargo build命令,将x86_64-unknown-linux-gnu作为目标,而不是x86_64-unknown-linux-musl(默认情况下,cargo build以某种方式执行musl目标),设法解决了这个问题

    因此,如果您正在尝试构建一个使用DPDK库的rust应用程序,并且缺少标题,请确保尝试以下操作:

    货物构建--target=x86_64-unknown-linux-gnu

    如果你不得不使用musl,而且没有其他选择,我没有答案。但对我来说这已经足够了

    如果有人解释为什么musl在这种情况下不工作,请让我们知道

    Reddit Rust社区也帮助了我,如果您感兴趣,请查看此链接:

    所以为什么build.rs无法找到.C头?

    回答


    因为我使用的是x86_64-unknown-linux-musl作为目标。

    C标记与此问题无关。正确地说,已将其删除。谢谢您的输入。@Mihai与dpdk标记相关,正如您所提到的那样,
    -I
    的编译器标记不满意吗?如果独立的DPDK库和应用程序在您的环境中工作,则是因为无法解决依赖关系?@VipinVarghese我认为可能存在涉及DPDK和musl gcc的问题,我不知道。无论哪种方式,我都设法通过使用cargo build构建——target=x86_64-unknown-linux-gnu来修复它。因此,通过使用gnu而不是musl,它以某种方式起到了作用。我认为musl和DPDK库之间存在某种不兼容,但我不完全确定,因为我不知道这些东西是如何工作的。如果你认为这与DPDK无关,更像是货物问题,请告诉我,我将删除DPDK标志。谢谢大家!@据我记忆所及,默认情况下DPDK Linux支持gcc、clang、llvm、openwrt和icc。因此,期待msul的工作是棘手的,我不认为有同样的测试。正如我所分享的,错误的真正原因是无法找到
    #include
    ,这可以通过要求cargo为您提供路径来解决。很高兴听到您的问题得到解决。据我所知,默认情况下DPDK Linux支持gcc、clang、llvm、openwrt和icc。因此,期待msul的工作是棘手的,我不认为有同样的测试。正如我所分享的,错误的真正原因是无法找到#include