在 Rust 中,如何解决 link 失败“/usr/libexec/gcc/avr/ld:找不到 -lstdc++”?

In Rust, how do I work around a link failiure "/usr/libexec/gcc/avr/ld: cannot find -lstdc++"?

我正在尝试为 Arduino Uno 进行交叉编译。我已经到了出现以下错误的地步:

 $ ~/.cargo/bin/cargo build
   Compiling bacon v0.1.0 (/home/thoth/src/rust-arduino-blink-3/bacon)
warning: cc1plus: warning: '-fPIC' is not supported [-fPIC]
   Compiling rust-arduino-blink-3 v0.1.0 (/home/thoth/src/rust-arduino-blink-3)
error: linking with `avr-gcc` failed: exit code: 1
  |
  = note: "avr-gcc" "-mmcu=atmega328p" "-Wl,--as-needed" "-L" "/home/thoth/.rustup/toolchains/nightly-2021-01-07-x86_64-unknown-linux-gnu/lib/rustlib/avr-atmega328p/lib" "/home/thoth/src/rust-arduino-blink-3/target/avr-atmega328p/debug/deps/rust_arduino_blink_3-09a480000c7899fd.panic_halt-0678487765a992dd.panic_halt.ei8zczol-cgu.0.rcgu.o.rcgu.o" "-o" "/home/thoth/src/rust-arduino-blink-3/target/avr-atmega328p/debug/deps/rust_arduino_blink_3-09a480000c7899fd.elf" "-Wl,--gc-sections" "-no-pie" "-L" "/home/thoth/src/rust-arduino-blink-3/target/avr-atmega328p/debug/deps" "-L" "/home/thoth/src/rust-arduino-blink-3/target/debug/deps" "-L" "/home/thoth/src/rust-arduino-blink-3/target/avr-atmega328p/debug/build/bacon-c6b054653910c446/out" "-L" "/home/thoth/.rustup/toolchains/nightly-2021-01-07-x86_64-unknown-linux-gnu/lib/rustlib/avr-atmega328p/lib" "-Wl,--start-group" "-Wl,-Bstatic" "/tmp/rustcKtTmC9/libbacon-279c1aaca7a35b3b.rlib" "-Wl,--end-group" "/home/thoth/src/rust-arduino-blink-3/target/avr-atmega328p/debug/deps/libcompiler_builtins-49233f77b92d585e.rlib" "-Wl,-Bdynamic" "-lstdc++" "-lgcc"
  = note: /usr/libexec/gcc/avr/ld: cannot find -lstdc++
          collect2: error: ld returned 1 exit status
          

error: aborting due to previous error; 1 warning emitted

error: could not compile `rust-arduino-blink-3`

我尝试从命令行 运行 avr-gcc,发现如果我删除 -lstdc++ 并将 /tmp/rustcKtTmC9/libbacon-279c1aaca7a35b3b.rlib 替换为 target/avr-atmega328p/debug/build/bacon-c6b054653910c446/out/libneopixel.a (因为 /tmp/rust* 目录被删除)编译成功(我可以使用 avrdude 安装 .elf)。

调整 Rust 构建过程以使其成功的正确方法是什么(删除 -lstdc++ 或添加使其能够找到库的标志)?

Rust 的 cc 包包含这样的逻辑,如果设置了 cpp 标志,它会包含 libstdc++。可以使用 build.cpp_set_stdlib(None) 禁用它。