我是Windows下的Rust开发新手。
我正在尝试绑定一个库libk4a,它在windows和linux.On linux上都是作为libk4a安装的,通常安装在/usr/local/include/k4a/k4a.h和/usr/local/lib/libk4a.so下。
我遵循了bindgen书的例子,并制作了一个传递给build.rs的wrapper.h,它很简单:
#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"如果它试图将包含路径作为this previous answer suggests添加到我的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我是否遗漏了向include路径添加内容的位置?k4a/k4a.h应该在我的路径上吗?还是我的配置中有拼写错误?我不知道为什么它可以在命令行上使用原始的bindgen,而不是build.rs。
发布于 2020-01-28 06:45:08
这个问题的答案很简单。
我添加了额外的clang参数
.clang_arg("-v")来查看clang获得的包含路径,我注意到它显示了
" C:\Program Files\Azure Kinect SDK v1.3.0\sdk\include\"基本上,在include路径之前有一个空格。移除它可以让它正常工作。
https://stackoverflow.com/questions/59924315
复制相似问题