在 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
我在系统升级后遇到了类似的问题。过了一会儿,我意识到这是因为
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
libstdc++-12-dev
由于这个 GitHub 评论,我想到了这个解决方案。这是最简单的解决方案,但它有一些缺点。在 Ubuntu 上,您可以使用
安装软件包sudo apt install libstdc++-12-dev
我面临的缺点是:
nvidia-driver-520-open
需要 gcc-13
怎么办?我必须再次弄清楚为什么会出现此错误,然后安装 libstdc++-13-dev
,这可能需要再次更新一些代码。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++
符号链接为,例如
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++ 构建系统中找到了解决方案。因此,关注点分离原则没有得到尊重。