6 个版本 (稳定)

1.2.3 2022年1月28日
1.2.1 2021年11月15日
1.2.0 2021年4月27日
1.2.0-alpha.1 2021年2月13日
0.1.1 2017年11月5日

#67FFI

Download history 428/week @ 2024-03-13 466/week @ 2024-03-20 420/week @ 2024-03-27 484/week @ 2024-04-03 570/week @ 2024-04-10 517/week @ 2024-04-17 570/week @ 2024-04-24 327/week @ 2024-05-01 210/week @ 2024-05-08 212/week @ 2024-05-15 281/week @ 2024-05-22 371/week @ 2024-05-29 371/week @ 2024-06-05 320/week @ 2024-06-12 282/week @ 2024-06-19 253/week @ 2024-06-26

1,278 每月下载次数
用于 9 个crate(6个直接使用)

CC0 许可证

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库和头文件
    • cc -print-search-dirs打印的目录中,或者
    • libomp Brew公式 或安装到macOS标准前缀的Macport提供,或者
    • 在Windows上使用MSVC的vcomp.dll等,或者
    • 在编译时分别指定在LIBRARY_PATHCFLAGS中的位置
      LIBRARY_PATH="<path containing libomp.{so|dylib|lib|a}>:<other library paths>"
      CFLAGS="-I<path containing omp.h> <other C flags>"
      
  • 为与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