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

leg*_*yO7 27 ubuntu clang++ flutter-linux

flutter runLinux 桌面应用程序出现此错误

\n
Running "flutter pub get" in proj...            5.3s\nLaunching lib/main.dart on Linux in debug mode...\nCMake Error at /usr/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake:62 (message):\n  The C++ compiler\n\n    "/usr/bin/clang++"\n\n  is not able to compile a simple test program.\n\n  It fails with the following output:\n\n    Change Dir: /media/kingbob/Dvolve/EData/proj/build/linux/x64/debug/CMakeFiles/CMakeTmp\n\n    Run Build Command(s):/usr/bin/ninja cmTC_5f1b6 && [1/2] Building CXX object CMakeFiles/cmTC_5f1b6.dir/testCXXCompiler.cxx.o\n    [2/2] Linking CXX executable cmTC_5f1b6\n    FAILED: cmTC_5f1b6 \n    : && /usr/bin/clang++   CMakeFiles/cmTC_5f1b6.dir/testCXXCompiler.cxx.o -o cmTC_5f1b6   && :\n    /usr/bin/ld: cannot find -lstdc++: No such file or directory\n    clang: error: linker command failed with exit code 1 (use -v to see invocation)\n    ninja: build stopped: subcommand failed.\n\n\n\n\n\n  CMake will not be able to correctly generate this project.\nCall Stack (most recent call first):\n  CMakeLists.txt:2 (project)\n\n\nBuilding Linux application...                                           \nException: Unable to generate build files\n
Run Code Online (Sandbox Code Playgroud)\n

flutter doctor 的输出

\n
Doctor summary (to see all details, run flutter doctor -v):\n[\xe2\x9c\x93] Flutter (Channel stable, 3.3.8, on Ubuntu 22.04.1 LTS 5.15.0-53-generic, locale en_IN)\n[\xe2\x9c\x93] Android toolchain - develop for Android devices (Android SDK version 33.0.0)\n[\xe2\x9c\x93] Chrome - develop for the web\n[\xe2\x9c\x93] Linux toolchain - develop for Linux desktop\n[\xe2\x9c\x93] Android Studio (version 2021.3)\n[\xe2\x9c\x93] Connected device (2 available)\n[\xe2\x9c\x93] HTTP Host Availability\n\n\xe2\x80\xa2 No issues found!\n
Run Code Online (Sandbox Code Playgroud)\n

clang++ 的输出 --version

\n
Ubuntu clang version 14.0.0-1ubuntu1\nTarget: x86_64-pc-linux-gnu\nThread model: posix\nInstalledDir: /usr/bin\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

然后我就出现了这个错误flutter run

\n
Launching lib/main.dart on Linux in debug mode...\n/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found\n/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found\n/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found\n/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found\n/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found\n/usr/include/glib-2.0/glib/glib-typeof.h:39:10: fatal error: 'type_traits' file not found\n
Run Code Online (Sandbox Code Playgroud)\n

Kev*_*vin 70

我在系统升级后遇到了类似的问题。过了一会儿,我意识到这是因为nvidia-driver-520-open安装了gcc-12。我使用clang-15的是通过脚本installClang15.sh安装的。clang-15取决于,因此安装libstdc++-11-devgcc-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
Run Code Online (Sandbox Code Playgroud)

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

感谢这个 GitHub 评论,我想到了这个解决方案。这是最简单的解决方案,但它有一些缺点。在 Ubuntu 上,您可以使用以下命令安装软件包

sudo apt install libstdc++-12-dev
Run Code Online (Sandbox Code Playgroud)

我面临的缺点是:

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

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

我没有找到任何干净且简单的方法来做到这一点,但有一些方法。clang-16截至 2022 年 11 月 28 日尚未发布,但在构建 clang时可用,这里有一个新选项--gcc-install-dir描述。这修复了编译:

$HOME/src/llvm-project/staging/bin/clang++ --gcc-install-dir=/usr/lib/gcc/x86_64-linux-gnu/11 a.cpp
Run Code Online (Sandbox Code Playgroud)

哪里a.cpp有一个简单的 C++“Hello World!” 程序

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

旧版本clang有该选项,但由于llvm 的讨论中--gcc-toolchain描述的原因,该选项不太有用。但是,您仍然可以发挥聪明才智,按照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/
Run Code Online (Sandbox Code Playgroud)

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

clang++ --gcc-toolchain=/opt/gcc-root a.cpp
Run Code Online (Sandbox Code Playgroud)

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

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

  • `sudo apt install libstdc++-12-dev` 对我有用 (5认同)

Bhi*_*uti 11

安装这个:

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

sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev
Run Code Online (Sandbox Code Playgroud)

您可以在此处阅读最后两个条目 https://github.com/flutter/flutter/issues/115909

  • `sudo apt install libstdc++-12-dev` 为我解决了问题 (4认同)