15

I have a basic rust/cargo project with a single main file and some basic dependencies. The cargo build command works fine when the target is not specified (I am using windows so it builds to windows), but when I try to cross compile the program to linux using cargo build --target=x86_64-unknown-linux-gnu or cargo build --target=x86_64-unknown-linux-musl, the process fails with the following error: linker 'cc' not found.

Does anyone have an idea how to get around this? Is there a specific linker I need to install?

Thanks.

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
Yaxlat
  • 665
  • 1
  • 10
  • 25

2 Answers2

16

I've just figured it out.

It turns out you need to tell cargo to use the LLVM linker instead. You do this by creating a new directory called .cargo in your base directory, and then a new file called config.toml in this directory. Here you can add the lines:

[target.x86_64-unknown-linux-musl]
rustflags = ["-C", "linker-flavor=ld.lld"]

Then building with the command cargo build --target=x86_64-unknown-linux-musl should work!

Yaxlat
  • 665
  • 1
  • 10
  • 25
  • 4
    So the above did not work for me (I got an error about missing lld) however the below did work. `[target.x86_64-unknown-linux-musl] linker = "rust-lld"` – Rory Sullivan Jan 17 '22 at 22:29
4

This post summarises the two responses of Yaxlat and Rory Sullivan - thank you both:

Create a file named config.toml in the newly created directory .cargo in your base directory.

This file has the following content:

[target.x86_64-unknown-linux-musl]
linker = "rust-lld"

Enter these two commands in the terminal

rustup target add x86_64-unknown-linux-musl

cargo build --target=x86_64-unknown-linux-musl

The executable binary for Linux is now in the target directory.

Twistleton
  • 2,735
  • 5
  • 26
  • 37