Reputation: 3906
I'm using Rust, bindgen, and a build script to work on some FFI bindings to a library.
This library is built using OpenMP, so when linking against it, I'd normally pass the -fopenmp
flag to the compiler.
How can I get this flag to be set by build.rs
when the library is built by Cargo?
Currently, building using Cargo fails, with the failing command being something like:
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
which fails with hundreds of undefined reference to 'GOMP_parallel_end'
errors.
Rerunning the generated command above with the -fopenmp
flag manually added succeeds.
I can specify the flag using RUSTFLAGS='-C link-args=-fopenmp'
before compiling, but is there a way of specifying it from within build.rs
?
Upvotes: 24
Views: 31601
Reputation: 1566
This feature was added to Cargo and stabilized in Cargo 1.56.
Linker arguments can be specified in build.rs
like so:
// Pass `-fopenmp` to the linker.
println!("cargo:rustc-link-arg=-fopenmp");
Upvotes: 32
Reputation: 431669
You cannot could not. See the sibling answer from ecstaticm0rse for an updated answer.
Before then, you can use a Cargo configuration file.
[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'
See also:
Upvotes: 27