运行 flutter linux 应用程序时出现“/usr/bin/ld: 找不到 -lstdc++: 没有这样的文件或目录”

问题描述 投票:0回答:2

在 Linux 桌面应用程序

flutter run
上出现此错误

Running "flutter pub get" in proj...            5.3s
Launching lib/main.dart on Linux in debug mode...
CMake Error at /usr/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake:62 (message):
  The C++ compiler

    "/usr/bin/clang++"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: /media/kingbob/Dvolve/EData/proj/build/linux/x64/debug/CMakeFiles/CMakeTmp

    Run Build Command(s):/usr/bin/ninja cmTC_5f1b6 && [1/2] Building CXX object CMakeFiles/cmTC_5f1b6.dir/testCXXCompiler.cxx.o
    [2/2] Linking CXX executable cmTC_5f1b6
    FAILED: cmTC_5f1b6 
    : && /usr/bin/clang++   CMakeFiles/cmTC_5f1b6.dir/testCXXCompiler.cxx.o -o cmTC_5f1b6   && :
    /usr/bin/ld: cannot find -lstdc++: No such file or directory
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    ninja: build stopped: subcommand failed.





  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:2 (project)


Building Linux application...                                           
Exception: Unable to generate build files

flutter doctor 的输出

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.3.8, on Ubuntu 22.04.1 LTS 5.15.0-53-generic, locale en_IN)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
[✓] Chrome - develop for the web
[✓] Linux toolchain - develop for Linux desktop
[✓] Android Studio (version 2021.3)
[✓] Connected device (2 available)
[✓] HTTP Host Availability

• No issues found!

clang++ --version 的输出

Ubuntu clang version 14.0.0-1ubuntu1
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

我注意到

/usr/lib/libstdc++.so
丢失了,所以手动创建了一个符号链接
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/lib/libstdc++.so

然后我在

flutter run

上遇到了这个错误
Launching lib/main.dart on Linux in debug mode...
/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found
/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found
/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found
/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found
/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found
/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found
ubuntu clang++ flutter-linux
2个回答
61
投票

我在系统升级后遇到了类似的问题。过了一会儿,我意识到这是因为

nvidia-driver-520-open
安装了
gcc-12
。我使用通过脚本
installClang15.sh
安装的 clang-15
clang-15
取决于,因此安装
libstdc++-11-dev
gcc-11
。问题是,一旦安装了
gcc-12
clang++
就会自动拾取它,而不是
gcc-11
。这可以通过
clang++ --verbose
来确认,它会输出类似

的内容
Ubuntu clang version 15.0.6
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/local/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64

解决方案1:安装
libstdc++-12-dev

由于这个 GitHub 评论,我想到了这个解决方案。这是最简单的解决方案,但它有一些缺点。在 Ubuntu 上,您可以使用

安装软件包
sudo apt install libstdc++-12-dev

我面临的缺点是:

  • 然后我将使用更新版本的 gcc(版本 12)。这可能需要(实际上这did需要)我更新我的代码。在这个问题的上下文中,这是非常有问题的,因为人们不一定控制代码。
  • 如果 6 个月后,
    nvidia-driver-520-open
    需要
    gcc-13
    怎么办?我必须再次弄清楚为什么会出现此错误,然后安装
    libstdc++-13-dev
    ,这可能需要再次更新一些代码。

解决方案 2:修复
clang++
使用的 gcc 安装

我没有找到任何干净、简单的方法来做到这一点,但有办法。

clang-16
,截至 2022 年 11 月 28 日尚未发布,但在 building clang 时可用,有一个新选项
--gcc-install-dir
描述于 here。这修复了编译:

$HOME/src/llvm-project/staging/bin/clang++ --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/11 a.cpp

其中

a.cpp
是一个简单的 C++“Hello World!”节目

#include <iostream>
int main() { std::cout << "Hello World!" << std::endl; }

旧版本的

clang
有选项
--gcc-toolchain
,由于在llvm的讨论中描述的原因,它不太有用。但是,您仍然可以发挥聪明才智,按照这个 Stack Overflow 答案 的建议进行操作。 TL;DR

sudo mkdir --parents /opt/gcc-root/lib/gcc/x86_64-linux-gnu
sudo ln --symbolic /usr/lib/gcc/x86_64-linux-gnu/11 /opt/gcc-root/lib/gcc/x86_64-linux-gnu/11
sudo ln --symbolic /usr/include /opt/gcc-root/

ln --symbolic /usr/include /opt/gcc-root/
很重要,否则我会遇到增量构建的问题。然后,你应该能够编译

clang++ --gcc-toolchain=/opt/gcc-root a.cpp

这留下了一个问题:“如何在系统范围内集成这个编译器选项?”我在这里没有找到满意的答案。

  • 您可以使用
    export CCC_OVERRIDE_OPTIONS=^--gcc-toolchain=/opt/gcc-root
    ,如此处所述并在 GitHub 上记录。这可能是这个问题背景下的最佳解决方案。
  • 您可以创建一个名为
  • clang++
     的 shell 脚本,其中包含
    
    #!/usr/bin/env bash /usr/local/bin/clang++ --gcc-toolchain=/opt/gcc-root "$@"
    然后使用
    export CXX=<PATH_TO_SCRIPT>/clang++
    。这在实践中效果很好:这是我快速而肮脏的修复。但是,我担心工具链中的其他工具(如 
    clang-tidy
    clangd
    )如果没有通过选项 
    --gcc-toolchain
     可能会出现问题。根据您的设置方式,他们可能看不到该选项,因为它不会位于使用 
    compile_commands.json
    CMake 变量创建的文件
    CMAKE_EXPORT_COMPILE_COMMANDS
    中。
  • 您可以使用
  • clang的配置文件TL;DR 是您将 clang++
     符号链接为,例如 
    fixed-gcc-root-clang++
    ,然后在适当的位置创建一个文件 
    fixed-gcc-root-clang++.cfg
    (对于 
    clang-15
    ,它是 
    /usr/lib/llvm-15/bin
    ),其中包含选项
    --gcc-toolchain=/opt/gcc-root
    。最后,您使用
    export CXX=fixed-gcc-root-clang++
    。问题是,如果某人或某物(例如 IDE)直接使用 
    clang++
    ,您的配置文件将不会被读取。如果创建指向 
    fixed-gcc-root-clang++
     的新符号链接(例如 
    c++ -> fixed-gcc-root-clang++
    ),您也会遇到问题,因为在这种情况下,将不会读取配置文件。
  • 我发现的最佳解决方案需要控制构建系统,因此它不适用于此问题的上下文。解决方案是修改您的构建系统工具链。我发现这并不令人满意,因为打包问题(记住,这都是因为
  • nvidia-driver-520-open
     安装了新的传递依赖项)在 C++ 构建系统中找到了解决方案。因此,
    关注点分离原则没有得到尊重。

10
投票
安装这个:

重新安装所有依赖项(现在包含在此处)

sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev
您可以在此处阅读最后两个条目

https://github.com/flutter/flutter/issues/115909

© www.soinside.com 2019 - 2024. All rights reserved.