我该如何在构建脚本中指定链接器标志/参数?

21

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

这段代码出现了数百个 undefined reference to 'GOMP_parallel_end' 错误。

手动添加 -fopenmp 标志并重新运行上述生成的命令可以成功。

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


1
我不明白,rustc是Rust编译器而不是C编译器。在你的情况下使用rustc-flags是毫无意义的。 - Stargateur
你应该使用openmp-sys - Stargateur
1
是的,仔细阅读后,rustc-flags 根本不是我想要的,我只是在寻找一种在构建期间调用 cc 命令时添加标志的方法。不过我会研究一下 openmp-sys,之前并不知道,谢谢。 - Dave Challis
openmp-sys 的文档会告诉你如何执行 cc.flag(&env::var("DEP_OPENMP_FLAG").unwrap()); - Stargateur
不幸的是,我没有使用“cc”包来构建C代码(它是使用自己的构建脚本构建的),因此只需要在链接已构建的库时存在该标志(除非可以使用“cc”包进行链接,我会检查一下)。 - Dave Challis
2个回答

28
这个功能已经 添加到Cargo 并且在 Cargo 1.56 中得到了 稳定化
链接器参数可以在 build.rs 中指定,就像这样:
// Pass `-fopenmp` to the linker.
println!("cargo:rustc-link-arg=-fopenmp");

26

不能无法。请查看来自ecstaticm0rse的兄弟答案更新的答案


在那之前,你可以使用Cargo 配置文件

.cargo/config

[build]
rustflags = ["-C", "link-args=-fsome-artisanal-option"]

执行

$ cargo build --verbose
   Compiling example v0.1.0 (file:///private/tmp/example)
     Running `rustc ...blah blah blah... -C link-args=-fsome-artisanal-option`
error: linking with `cc` failed: exit code: 1
  |
  = note: "cc" "-m64" ...blah blah blah... "-fsome-artisanal-option"
  = note: clang: error: unknown argument: '-fsome-artisanal-option'

另请参阅:


2
谢谢,这让我更接近目标了。我试图在 build.rs 中指定它的原因是它需要有条件地进行设置,因为我链接的库可以使用 openmp 构建或不使用 openmp 构建,这可以在 build.rs 中检测到。那么,唯一的选择是从我的 build.rs 中编写一个 .cargo/config,其中包含必要的不同链接参数来进行编译吗? - Dave Challis
1
@DaveChallis 我甚至不知道那是否可行。但每次添加额外的链接器标志又有什么坏处呢?它们应该被忽略,因为没有需要的符号。 - Shepmaster
1
现在采用这种方法应该不会有什么问题,我们就先走这条路吧。 - Dave Challis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接