我正在使用Rust、bindgenbuild 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

它失败了,出现了数百个错误.

使用手动添加的-fopenmp标志重新运行上面生成的命令成功.

我可以在编译之前使用RUSTFLAGS='-C link-args=-fopenmp'指定标志,但是有没有办法从build.rs中指定它?

推荐答案

这项功能已经达到了added to Cargo,达到了stabilized in Cargo 1.56.被接受的答案现在已经过时了.

链接器参数可以在build.rs中指定,如下所示:

// Pass `-fopenmp` to the linker.
println!("cargo:rustc-link-arg=-fopenmp");

Rust相关问答推荐

即使参数和结果具有相同类型,fn的TypId也会不同

Tauri tauri—apps/plugin—store + zustand

何时可以在Rust中退出异步操作?

如果成员都实现特征,是否在多态集合上实现部分重叠的特征?

函数内模块的父作用域的访问类型

在使用AWS SDK for Rust时,如何使用硬编码访问密钥ID和密钥凭据?

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

在Rust 中移动原始指针的靶子安全吗

我如何使用AWS SDK for Rust获取我承担的角色的凭据?

为相同特征的特征对象使用 move 方法实现特征

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

try 从标准输入获取用户名和密码并删除 \r\n

我可以用 Rust 编写一个不可变变量

为什么带有生命周期指定的方法不能被调用两次?

(let b = MyBox(5 as *const u8); &b; ) 和 (let b = &MyBox(5 as *const u8); ) 之间有什么区别

是否可以通过可变引用推进可变切片?

如何为返回正确类型的枚举实现 get 方法?

Rust 中的运行时插件

Rust:为什么在 struct 中borrow 引用会borrow 整个 struct?

如何在宏中的多个参数上编写嵌套循环?