【问题标题】:How can I specify linker flags/arguments in a build script?如何在构建脚本中指定链接器标志/参数?
【发布时间】:2018-11-11 13:05:35
【问题描述】:

我正在使用 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 中指定它?

【问题讨论】:

  • 我不明白,rustc 是 rust 编译器而不是 C 编译器。在您的情况下使用 rustc-flags 毫无意义。
  • 你应该使用openmp-sys
  • 是的,更仔细地阅读,rustc-flags 根本不是我想要的,只是在寻找一种在构建期间调用的cc 命令添加标志的方法。会调查openmp-sys,但不知道,谢谢。
  • openmp-sys的文档告诉你怎么做cc.flag(&env::var("DEP_OPENMP_FLAG").unwrap());
  • 不幸的是,我没有使用 cc crate 构建 C 代码(它是使用自己的构建脚本构建的),因此在再次链接构建的库时只需要存在标志(除非cc crate 可以用于那个,会检查)。

标签: rust ffi


【解决方案1】:

不能不能。请参阅 the sibling answer from ecstaticm0rse 以获取更新的答案。


在此之前,您可以使用 Cargo configuration file

.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'

另见:

【讨论】:

  • 谢谢,这让我更接近了一点。我试图在 build.rs 中指定它的原因是它必须是有条件的,因为我链接的库可以在有/没有 openmp 的情况下构建,这在build.rs 中检测到。是在编译时从我的 build.rs 中编写 .cargo/config 的唯一选择,其中包含必要的不同链接参数?
  • @DaveChalis 我什至不知道这是否可行。但是,一直添加额外的链接器标志有什么害处?它们应该被忽略,因为不需要任何符号。
  • 是的,应该不会有什么坏处,暂时会走这条路。
【解决方案2】:

此功能已被 added to Cargostabilized in Cargo 1.56。接受的答案现已过时。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-11
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多