error: linking with `cc` failed: exit code: 1

error: linking with `cc` failed: exit code: 1

我有一个单个.rs 文件。当我按 rustc test1.rs 编译它时,出现错误:

    error: linking with `cc` failed: exit code: 1
note: cc '-m64' '-L' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib' '-o' 'test1' 'test1.o' '-Wl,-force_load,/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/libmorestack.a' '-Wl,-dead_strip' '-nodefaultlibs' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/libstd-4e7c5e5c.rlib' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/libcollections-4e7c5e5c.rlib' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/libunicode-4e7c5e5c.rlib' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/librand-4e7c5e5c.rlib' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/liballoc-4e7c5e5c.rlib' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/liblibc-4e7c5e5c.rlib' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib/libcore-4e7c5e5c.rlib' '-L' '/usr/local/Cellar/rust/1.0.0-alpha/lib/rustlib/x86_64-apple-darwin/lib' '-L' '/Users/alex/Documents/projects/rust/.rust/lib/x86_64-apple-darwin' '-L' '/Users/alex/Documents/projects/rust/lib/x86_64-apple-darwin' '-lSystem' '-lpthread' '-lc' '-lm' '-lcompiler-rt'
note: ld: warning: directory not found for option '-L/Users/alex/Documents/projects/rust/.rust/lib/x86_64-apple-darwin'
ld: warning: directory not found for option '-L/Users/alex/Documents/projects/rust/lib/x86_64-apple-darwin'
ld: can't open output file for writing: test1, errno=21 for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

error: aborting due to previous error


$ rustc --version
rustc 1.0.0-dev

我看过一些与此相关的主题,但其中 none 帮助我解决了问题。

根据您的命令 rustc test1.rs,编译器推断出可执行文件的名称应该是 test1。链接器尝试打开此文件以便写入可执行文件,但失败并显示 errno=21,其字符串化版本为 "Is a directory".

这表明您的工作目录中有一个名为 test1 的目录导致了冲突。

我在 Mac 编译 Rust 时遇到 三个问题

首先: 如果您对 ld 编写 files/dirs 有任何问题,只需删除该文件并尝试重新编译。我不知道为什么,但 Mac 这个问题时常发生。

其次: 如果您还有其他 ld 错误(与文件访问无关):尝试将以下部分添加到您的 ~/.cargo/config(如果您没有这个文件可以随意创建):

[target.x86_64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

[target.aarch64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

第三: 有时你的 Mac 缺少一些开发 tools/dependencies。使用以下命令自动安装其中最重要的部分:

xcode-select --install

如果你有“注意:/usr/bin/ld:找不到-lsqlite3”

然后安装 libsqlite3-dev:$ sudo apt install libsqlite3-dev

这适用于 Rust 1.53.0,Linux Mint 20.2(基于 Ubuntu 20.04 LTS)

如果您有配备 ARM 处理器的 MacBook M1(x),您需要从 rustup 安装 rust https://sourabhbajaj.com/mac-setup/Rust/

当您 运行 rustup-init 时,使用自定义选项将 aarch64-apple-darwin 更改为 x86_64-apple-darwin

然后您可以将以下内容添加到 .cargo/config.toml.cargo/config(都可以)

[target.x86_64-apple-darwin]
rustflags = [
  "-C", "link-arg=-undefined",
  "-C", "link-arg=dynamic_lookup",
]

此解决方案已通过 Rust 1.54 和 MacBook M1 测试

我能够执行 cargo build --release 并根据本教程生成一个 dylib 文件 https://www.youtube.com/watch?v=yqLD22sIYMo