gpt4 book ai didi

ubuntu - "/usr/bin/ld: cannot find -lstdc++: No such file or directory"正在运行 flutter linux 应用程序

转载 作者:行者123 更新时间:2023-12-05 08:15:43 46 4
gpt4 key购买 nike

在 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 不见了,所以手动创建了一个符号链接(symbolic link)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

最佳答案

我在升级系统后遇到了类似的问题。过了一会儿,我意识到这是因为 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

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

感谢 this GitHub comment,我想到了这个解决方案.这是最简单的解决方案,但它有一些缺点。在 Ubuntu 上,您可以使用

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

我面临的缺点是:

  • 然后我会使用更新版本的 gcc(第 12 版)。这可能需要(实际上这确实需要)我更新我的代码。在这个问题的上下文中,这是非常有问题的,因为在这个问题中,不一定能控制代码。
  • 如果 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 ,由于描述的原因,它不是很有用 on llvm's discourse .不过,你还是可以别出心裁,为所欲为this Stack Overflow answer建议。 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如所述here并记录在案 on GitHub .这可能是针对此问题的最佳解决方案。
  • 您可以创建一个名为 clang++ 的 shell 脚本包含
    #!/usr/bin/env bash
    /usr/local/bin/clang++ --gcc-toolchain=/opt/gcc-root "$@"
    然后使用 export CXX=<PATH_TO_SCRIPT>/clang++ .这在实践中工作得很好:这是我快速而肮脏的修复。但是,我担心工具链中的其他工具(如 clang-tidyclangd )如果未通过选项 --gcc-toolchain 可能会出现问题。 .根据您的设置方式,他们可能看不到该选项,因为它不在文件 compile_commands.json 中。使用 CMAKE_EXPORT_COMPILE_COMMANDS CMake variable 创建.
  • 你可以使用 clang's configuration files . TL;DR 是您符号链接(symbolic link) 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++ 的新符号链接(symbolic link),您也会遇到问题被创建,例如 c++ -> fixed-gcc-root-clang++ , 因为在这种情况下,不会读取配置文件。
  • 我找到的最佳解决方案需要控制构建系统,因此它不适用于此问题的上下文。解决方案是修改您的构建系统工具链。我发现这并不令人满意,因为打包问题(记住,这都是因为 nvidia-driver-520-open 安装了一个新的传递依赖项)在 C++ 构建系统中找到了解决方案。因此,the separation of concerns不尊重原则。

关于ubuntu - "/usr/bin/ld: cannot find -lstdc++: No such file or directory"正在运行 flutter linux 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74543715/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com