【发布时间】:2018-11-11 13:05:35
【问题描述】:
我正在使用 Rust、bindgen 和 build script 处理与库的一些 FFI 绑定。
这个库是使用OpenMP 构建的,所以在链接它时,我通常会将-fopenmp 标志传递给编译器。
当库由 Cargo 构建时,如何让 build.rs 设置此标志?
目前,使用 Cargo 构建失败,失败的命令类似于:
cc -Wl,--as-needed -Wl,-z,noexecstack -m64 -l gomp -l stdc++
...skipping dozens of paths/files...
-Wl,-Bdynamic -l dl -l rt -l pthread -l gcc_s -l c -l m -l rt -l pthread -l util
失败并出现数百个undefined reference to 'GOMP_parallel_end' 错误。
使用手动添加的-fopenmp 标志重新运行上面生成的命令成功。
我可以在编译之前使用RUSTFLAGS='-C link-args=-fopenmp' 指定标志,但是有没有办法从build.rs 中指定它?
【问题讨论】:
-
我不明白,rustc 是 rust 编译器而不是 C 编译器。在您的情况下使用
rustc-flags毫无意义。 -
你应该使用
openmp-sys -
是的,更仔细地阅读,
rustc-flags根本不是我想要的,只是在寻找一种在构建期间调用的cc命令添加标志的方法。会调查openmp-sys,但不知道,谢谢。 -
openmp-sys的文档告诉你怎么做
cc.flag(&env::var("DEP_OPENMP_FLAG").unwrap()); -
不幸的是,我没有使用
cccrate 构建 C 代码(它是使用自己的构建脚本构建的),因此在再次链接构建的库时只需要存在标志(除非cccrate 可以用于那个,会检查)。