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

Posted

技术标签:

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

我正在使用 Rust、bindgen 和 build 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 可以用于那个,会检查)。 【参考方案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'

另见:

How to get the linker to produce a map file using Cargo How can I globally configure a Cargo profile option? Is it possible to specify `panic = "abort"` for a specific target?

【讨论】:

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

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

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

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

【讨论】:

以上是关于如何在构建脚本中指定链接器标志/参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命令行将“其他链接器标志”添加到 xcode 项目?

在 Xcode 中,如何在我的项目设置中指定正确的库以避免链接错误?

我无法在链接描述文件中指定 Rust 程序的起始偏移量是不是有原因?

gcc 链接器库搜索顺序;路径加静态与共享

如何在 CMake 中指定链接类型?

如何在 CMake 的 try_compile 函数中为 OpenMP 设置链接器标志