0

我是 Windows 下 Rust 开发的新手。

我正在尝试在windows和libk4alinux 上绑定一个库.libk4a/usr/local/include/k4a/k4a.h/usr/local/lib/libk4a.so

我已经按照 bindgen 书的例子做了一个wrapper.hto pass to build.rs,这很简单:

#include <k4a/k4a.h>

这在 linux 下工作正常,build.rs设置为

println!("cargo:rustc-link-lib=k4a");

在 Windows 上,dll 位于下方C:\Program Files\Azure Kinect SDK v1.3.0\sdk\windows-desktop\amd64\release\bin\,标题位于C:\Program Files\Azure Kinect SDK v1.3.0\sdk\include\k4a\k4a.h

虽然我可以自己运行 bindgen

bindgen wrapper.h -- -I "C:\Program Files\Azure Kinect SDK v1.3.0\sdk\include"

如果它尝试在我的 build.rs 中添加包含路径,如前面的答案所示

   let bindings = bindgen::Builder::default()
        .header("wrapper.h")
        .clang_arg("-I \"C:\\Program Files\\Azure Kinect SDK v1.3.0\\sdk\\include\"")
        .parse_callbacks(Box::new(bindgen::CargoCallbacks))
        .generate()
        .expect("Unable to generate bindings");

我仍然收到错误说它找不到头文件:

wrapper.h:1:10: fatal error: 'k4a/k4a.h' file not found
wrapper.h:1:10: fatal error: 'k4a/k4a.h' file not found, err: true
thread 'main' panicked at 'Unable to generate bindings: ()', build.rs:11:20

我是否缺少向包含路径添加内容的地方?应该k4a/k4a.h在我的路上吗?还是我的配置中有错字?我不确定为什么它bindgen在命令行上与 raw 一起使用,但不是build.rs.

4

1 回答 1

0

这个问题有一个简单的答案。

我添加了额外的 clang 参数

.clang_arg("-v")

查看 clang 获得的包含路径,我注意到它显示了

" C:\Program Files\Azure Kinect SDK v1.3.0\sdk\include\"

基本上在包含路径之前有一个空格。删除它使其工作。

于 2020-01-27T22:45:08.343 回答