6 个版本 (稳定)
1.2.3 | 2022年1月28日 |
---|---|
1.2.1 | 2021年11月15日 |
1.2.0 | 2021年4月27日 |
1.2.0-alpha.1 |
|
0.1.1 |
|
#67 在 FFI
1,278 每月下载次数
用于 9 个crate(6个直接使用)
17KB
246 行
Rust程序OpenMP库链接
此crate 允许使用依赖于OpenMP的C代码与Rust一起使用。它使Cargo链接到OpenMP,因此与Rust程序链接的C静态库可以使用OpenMP。
它不能与纯Rust程序一起使用(对于Rust,Rayon 是更好的选择)。
注意:此crate不能自动为构建脚本编译的C代码启用OpenMP。您还需要将适当的OpenMP启用标志传递给C编译器(请参见以下用法)。如果设置不生效,可能需要进行cargo clean
和重新构建。
要求
- Rust 1.45或更高版本
- OpenMP库和头文件
- 为与Rust程序链接的任何C代码设置OpenMP启用标志
用法
1. 添加Rust依赖
将 openmp-sys
添加为运行时依赖项(例如,通过以下命令:cargo install cargo-edit; cargo add openmp-sys
)然后添加到您的 lib.rs
extern crate openmp_sys;
即使在 Rust 2018 中,这也是必须的,因为如果 openmp_sys
在源代码中没有提及,它将不会链接。
2. 配置 C 编译器
正在链接的 C 代码必须使用启用 OpenMP 的标志进行编译。如果您也将 openmp-sys
添加为开发依赖项,它将为 您的 build.rs
脚本 设置 DEP_OPENMP_FLAG
环境变量,并带有适当的标志(或有时是多个标志),例如 -fopenmp
或 /openmp
,具体取决于目标编译器。如果您使用 cc
包 编译 C 代码,则可以这样设置标志:
let mut cc_build = cc::Build::new();
env::var("DEP_OPENMP_FLAG").unwrap().split(" ").for_each(|f| { cc_build.flag(f); });
挑剔的链接器
openmp-sys
包会自动告诉 Cargo 适当地链接 lib(g)omp。然而,一些链接器对库指定的顺序很挑剔,自动技巧不足以解决问题。
如果您在链接时遇到关于缺少 libgomp.so
的链接器错误,请尝试在告诉 Cargo 链接您的 C 代码后再次链接它。此库在 DEP_OPENMP_CARGO_LINK_INSTRUCTIONS
变量中提供了为此提供的 Cargo 指令列表。
cc_build.compile("libexample.a");
if let Some(link) = env::var_os("DEP_OPENMP_CARGO_LINK_INSTRUCTIONS") {
for i in env::split_paths(&link) {
println!("cargo:{}", i.display());
}
}
静态链接
可选地,您可以通过启用 static
特性或设置 OPENMP_STATIC=1
环境变量来静态链接 OpenMP,这样使用它的可执行文件就可以在没有编译器安装的机器上使用。
[dependencies.openmp-sys]
features = ["static"]
version = "1.2"
自定义 CC
您可以通过使用 CC
环境变量在构建时指定另一个 C 编译器。然而,在链接时,Cargo 仍然默认使用 cc
,无论编译时选择了什么。如果需要,可以通过设置 CARGO_TARGET_<triple>_LINKER
或 ~/.cargo/config
中的相应项来覆盖此设置。
macOS
在 macOS 上,支持 Apple Clang 和原始 Clang,前提是提供了 libomp
的副本(如上述要求中所述)。如果您使用 GCC,则不需要此,因为 GCC 已捆绑了 libgomp
。如果您的程序需要 GCC,则只需执行 CC=<gcc exe name> cargo build
即可。
在 macOS 上推荐使用静态链接。
依赖项
~180KB