Search code examples
rustffi

How can I specify linker flags/arguments in a build script?


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?


Solution

  • 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");