【问题标题】:How should I resolve a "ld: library not found for -liconv" error when running "cargo build"?运行“cargo build”时,我应该如何解决“ld: library not found for -liconv”错误?
【发布时间】:2022-07-04 05:46:11
【问题描述】:

通过以下命令安装 Rust 和 Cargo 后...

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

我在一个很小的“Hello World”Rust 项目上运行 cargo build 并收到以下错误:

= note: ld: library not found for -liconv
          collect2: error: ld returned 1 exit status
          

error: could not compile `hello_world` due to previous error

我尝试了rustup self uninstall,然后通过brew 安装了 Rust 和 Cargo,但在尝试构建时遇到了同样的错误。

我正在运行 macOS Big Sur 11.6.4。

【问题讨论】:

  • 是否安装了iconv/libiconv?它是处理非 ASCII 文本编码的标准库,没有它,大多数处理非 ASCII 文本的东西都会出现问题。
  • 我安装了iconv,但没有安装libiconv
  • 错误基本上是说“你正在构建的东西需要libiconv,ld(库加载器)找不到它”,所以解决方案是:1)安装libiconv如果它丢失了,和/或 2) 修复环境(设置 LIBRARY_PATHLD_LIBRARY_PATHLD_RUN_PATH 之类的东西,或提供与编译器等效的开关)以找到已安装的 libiconv

标签: rust rust-cargo iconv


【解决方案1】:

第一步是通过 Homebrew 安装libiconv

brew install libiconv

请注意,输出的内容很奇怪:

==> Caveats
libiconv is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS already provides this software and installing another version in
parallel can cause all kinds of trouble.

If you need to have libiconv first in your PATH, run:
  echo 'export PATH="/opt/homebrew/opt/libiconv/bin:$PATH"' >> ~/.zshrc

For compilers to find libiconv you may need to set:
  export LDFLAGS="-L/opt/homebrew/opt/libiconv/lib"
  export CPPFLAGS="-I/opt/homebrew/opt/libiconv/include"

我无法拼凑出完整的解释,但这与 MacOS 提供的 libiconv 版本符号错误有关。在我的系统上找不到libiconv(它是 M1 的东西吗?);尽管如此,brew 拒绝介入操作系统,这似乎是一个合理的决定。

但是,这些变量不适用于cargo

解决问题的最佳方法(我发现)是修改您的 LIBRARY_PATH 变量以提供 iconv 的路径。您可能已经修改了您的LIBRARY_PATH(参见例如https://apple.stackexchange.com/questions/40704/homebrew-installed-libraries-how-do-i-use-them)。

我所做的就是将以下行添加到我的~/.zshrc

export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix)/lib:$(brew --prefix)/opt/libiconv/lib

之后libiconv被正确检测到。

【讨论】:

    【解决方案2】:

    如果您安装了 GNU gcc,或者任何非 Apple C 编译器,都可能导致此问题。

    除了按照其他答案的建议 (brew install libiconv) 外,还要检查您的 cc 命令是 Apple clang 还是 gcc 版本。您可以使用which -a cc 来执行此操作。

    要基本上确保cc 是您的系统,您可以运行以下命令:

    export PATH="/usr/bin/:$PATH"
    

    那么 rust 应该会起作用

    【讨论】:

      猜你喜欢
      • 2019-10-31
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      • 2020-12-10
      • 2013-12-17
      • 1970-01-01
      • 2010-11-24
      相关资源
      最近更新 更多