首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于头文件中的相对路径导致Bindgen失败

由于头文件中的相对路径导致Bindgen失败
EN

Stack Overflow用户
提问于 2022-11-16 02:01:46
回答 1查看 28关注 0票数 0

我试图为vmaf构建一些绑定,但我遇到了一些问题。vmaf存储库中的头文件和.c文件位于单独的文件夹中。在主vmaf.h文件引用同一目录中的其他.h文件时,我遇到了一个问题:

代码语言:javascript
复制
#ifndef __VMAF_H__
#define __VMAF_H__

#include <stdint.h>
#include <stdio.h>

#include "libvmaf/compute_vmaf.h"
#include "libvmaf/model.h"
#include "libvmaf/picture.h"
#include "libvmaf/feature.h"
...

这导致我得到以下构建错误:vmaf/libvmaf/include/libvmaf/libvmaf.h:25:10: fatal error: 'libvmaf/compute_vmaf.h' file not found。在我看来,锈菌-bindgen正在当前工作目录中查找下一个头文件,而实际上它作为指向vmaf git存储库的git子模块存在于项目的子目录中。

这是文件夹结构

代码语言:javascript
复制
.
├── src # lib.rs lives here
├── target
│   └── debug
└── vmaf
    ├── libvmaf
    │   ├── doc
    │   ├── include
    │   │   └── libvmaf # vmaf.h lives here along with other .h files
    │   ├── src # various other .h files live here
    │   │   ├── arm
    │   │   ├── compat
    │   │   ├── ext
    │   │   ├── feature
    │   │   └── x86
    │   ├── test
    │   └── tools

这是我的build.rs

代码语言:javascript
复制
extern crate meson;
use std::env;
use std::path::PathBuf;

fn main() {
    //env::set_var("RUST_BACKTRACE", "1");
    let build_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    _ = build_path.join("build");
    let build_path = build_path.to_str().unwrap();

    println!("cargo:rustc-link-lib=libvmaf");
    println!("cargo:rustc-link-search=native={build_path}");
    meson::build("vmaf/libvmaf", build_path);

    let bindings = bindgen::Builder::default()
    .header("vmaf/libvmaf/include/libvmaf/libvmaf.h")
    .parse_callbacks(Box::new(bindgen::CargoCallbacks))
    .generate()
    .expect("Unable to generate bindings");

    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings.write_to_file(out_path).expect("Couldn't write bindings!")
}

如何才能让锈菌绑定到目录中,而不是从当前的工作目录中查看?我应该使用cargo:rustc-link-search并将其指向正确的目录吗?这会不会导致链接到库本身的混乱,因为我之前已经使用这个语句来编译介子项目了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-19 00:08:02

最终答案是clang的-I标志。

代码语言:javascript
复制
// Path to vendor header files
    let headers_dir = PathBuf::from("vmaf/libvmaf/include");
    let headers_dir_canonical = canonicalize(headers_dir).unwrap();
    let include_path = headers_dir_canonical.to_str().unwrap();

    // Generate bindings to libvmaf using rust-bindgen
    let bindings = bindgen::Builder::default()
        .header("vmaf/libvmaf/include/libvmaf/libvmaf.h")
        .clang_arg(format!("-I{include_path}")) // New Stuff!
        .parse_callbacks(Box::new(bindgen::CargoCallbacks))
        .generate()
        .expect("Unable to generate bindings");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74454306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档